有点意思
题目描述
有一个按照以下规则生成的无限集
规则一:\(1\)在集合中
规则二:若\(x\)在集合中,那么\(a\cdot x\)以及\(b+x\)在集合中
每次询问数\(n\)是否在集合中
输入格式
第一行一个数\(t\)表述测试组数
之后\(t\)行,每行三个数分别表述\(n,a,b\).
输出格式
共\(t\)行,每一行输出Yes和No表示答案
数据范围
\(t\le500,1\le a,b,n\le10^9\)。
易证:\(\forall x\in S,x=a^{k_1}+k_2 b.k_1,k_2\in N\)
无论是乘\(a\)还是加\(b\)都只是在改变\(b\)的系数而已
所以我们只需要枚举\(k_1\),判断是否能找到满足条件的\(k_2\),及判断\(b\mid(n-a^{k_1})\)是否成立即可。
不要忘记特判\(a=1\)的情况,复杂度\(\Theta(t\log_a n)\)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
long long T,n,a,b;
int main()
{
scanf("%lld",&T);
while(T--)
{
scanf("%lld %lld %lld",&n,&a,&b);
if(n%b==1||b==1)
{
printf("Yes\n");
continue;
}
else if(a==1)
{
printf("No\n");
continue;
}
bool flag=0;
for(long long i=0,j=1;j<=n&&!flag;i++,j*=a)
if((n-j)%b==0)
flag=1;
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}