思路:
通过手推,可以发现集合中的数一定可以表示为 a ^ c1 + c2 * b 的形式,因此可以枚举c1的值 ,判断是否存在对应的c2即可(注意特判a == 1),复杂度log(n)。
注意:1.不能通过枚举c2来判断是否存在对应的c1,因为此时复杂度为O(n),显然过不去
2.记得开LL
代码:
#include<bits/stdc++.h>
using LL = long long;
void solve(){
// I know you are here
// Thank you for your appreciation
int n, a, b;
std::cin >> n >> a >> b;
if(a == 1) {
if((n - 1) % b == 0) {
std::cout << "Yes\n";
}
else {
std::cout << "No\n";
}
return;
}
LL now = 1;
while(now <= n) {
if((n - now) % b == 0) {
std::cout << "Yes\n";
return;
}
now *= a;
}
std::cout << "No\n";
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);std::cout.tie(0);
int _;
std::cin >> _;
while(_--){
solve();
}
return 0;
}