不难发现,其实这些可能的答案都是可以转化为a^x+b*y==n的形式的;
考虑数据范围,x最多枚举到30就可以了,然后对于每个x,对y进行枚举即可,时间复杂度是log级别的;
这个题有两个坑点:
第一个是虽然数据范围是<1e9,但仍然应该开ll,否则会因为溢出造成的负数而死循环;
第二个是注意a的取值,如果是1还这么枚举就会纯纯的死循环;
因为这两个点T了好几发qaq
完整代码:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main(){
std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
// freopen("cfsb.out","w",stdout);
ll _;cin>>_;while(_--){
ll n,a,b;cin>>n>>a>>b;
bool flag=0;
if(a==1){
if((n-1)%b==0)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
else{
for(ll x=1;x<=n;x*=a){
if((n-x)%b==0){
flag=1;
cout<<"YES"<<endl;
break;
}
}
if(!flag){
cout<<"NO"<<endl;
}
}
}
return 0;
}