利用vps做网站查询网入口
原题链接:Problem - 1542B - Codeforces
题目大意:初始集合里面只有1,给a和b,可以对集合里面的数x进行二种操作,x*a,x+b,并放入集合,给数n,问集合里面会不会产生n,会就输出yes,不会就输出no。
思路:如果n会出现在集合里面,那么他一定是由a^c1+c2*b这种形式,c1和c2为未知数,如果进行操作1,那么就会对数进行乘a的操作,因为初始只有1,那么必定会产生a^c1这种数,如果进行了操作2,那么就会加上b,如果继续操作2,那么就会变成2b,如果操作1,那么就会变成ab,但是肯定可以提出一个公因子b,然后将另一部分看为c2。因为c1是操作1的操作数,而且2^64>1e16,所以可以直接从小到大枚举c1。
//冷静,冷静,冷静
//调不出来就重构
#pragma GCC optimize(2)
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pii;
const int N=1e6+10,mod=998244353;
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);ll t;cin>>t;while(t--){ll n,a,b;cin>>n>>a>>b;ll now=1,f=0;if(a==1) {if((n-1)%b==0){cout<<"Yes"<<endl;}else cout<<"No"<<endl;continue;}while(now<=n){if((n-now)%b==0)//如果a^c1已经减完了,那么剩下的数是b的倍数{f=1;break;}now*=a;//a^c1}if(f)cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}