题意
有一个集合序列S,刚开始只有一个数1,不断对其序列里的数字*a或+b,构造出无限长的序列,给定一个数n,求n是否在这个集合序列之中。
解析
当我们对数字+b后再乘a,实际上是加上了 a个b,因此每一项 S i S_i Si都满足, S i = a t + k ∗ b S_i=a^t+k*b Si=at+k∗b,我们可以不断枚举 a t a^t at,然后判断是否能整除 b b b即可。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, mod = 1e9 + 7;
typedef long long ll;
int main() {
int t;
cin >> t;
while (t--) {
int n,a,b;
int flag=0;
cin>>n>>a>>b;
if(a==1){
if((n-1)%b==0)flag=1;
}
else{
for(ll i=1;i<=n;i*=a){
if((n-i)%b==0){
flag=1;
}
}
}
if(flag){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
}