Codeforces Round #729 (Div. 2) B. Plus and Multiply(有意思的构造)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #729 (Div. 2) B. Plus and Multiply(有意思的构造)相关的知识,希望对你有一定的参考价值。

LINK

题意

定义一个无限集合,首先 1 1 1在集合中

Ⅰ.若元素 x x x在集合中,那么 x ∗ a x*a xa在集合中

Ⅱ.若元素 x x x在集合中,那么 x + b x+b x+b在集合中

给定 n , a , b n,a,b n,a,b,问 n n n是否在参数为 a , b a,b a,b的无限集合中


毫无疑问,这题的难度远超 d i v 2 D \\rm div2D div2D的难度

让我们慢慢分析…


考虑为了凑成 n n n,共执行 z z z次操作Ⅰ,

设第 i i i次执行操作Ⅰ后连续执行了 k i k_i ki次操作二

得到

n = ∑ i = 0 z k i ∗ b ∗ a i + a z n=\\sum\\limits_{i=0}^{z} k_i*b*a^i+a^z n=i=0zkibai+az

其中 z , k i z,k_i z,ki [ 0 , inf ⁡ ] [0,\\inf] [0,inf]中的任意数

发现 a z a^z az增长的会非常快,考虑枚举 z z z得到

n − a z = ∑ i = 0 z k i ∗ b ∗ a i n-a^z=\\sum\\limits_{i=0}^zk_i*b*a^i naz=i=0zkibai

发现此时 n − a z n-a^z naz b b b一定为零

而且我们可以证明,只要满足上述条件,就一定能找到一组正确的 k i k_i ki

因为可以构造一组这样的解

k i = { n − a z b i=0 0 i!=0 k_i= \\begin{cases} \\frac{n-a^z}{b}& \\text{i=0}\\\\ 0& \\text{i!=0}\\\\ \\end{cases} ki={bnaz0i=0i!=0

所以枚举 z z z即可得到解,特判 a = 1 a=1 a=1的情况即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,a,b;
signed main()
{
	int t; cin >> t;
	while( t-- )
	{
		cin >> n >> a >> b;
		if( a==1 )	
		{
			if( (n-1)%b==0 )	cout << "YES\\n";
			else	cout << "No\\n";
			continue;
		}
		int az = 1, flag = 0;
		for(int i=1;;i++)
		{
			if( az>n )	break;
			if( (n-az)%b==0 )	flag = 1;
			az = az*a;
		}
		if( flag )	cout << "Yes\\n";
		else	cout << "No\\n";
	}
}

以上是关于Codeforces Round #729 (Div. 2) B. Plus and Multiply(有意思的构造)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #729 (Div. 2)

Codeforces Round #729 div.2 A-E题解

Codeforces Round #729 div.2 A-E题解

Codeforces Round #729 (Div. 2) C(数学)

Codeforces Round #729 (Div. 2) D. Priority Queue(简单dp)

Codeforces Round #729 (Div. 2) C. Strange Function