CF1542B
Plus and Multiply
这个数集的特点可以通过手动扩展的方式看出,当然,也可以通过直接分析性质看出。
首先,对于
我们分析一手
而
因此,我们发现一个数在数集中,当且仅当它可以表示为
那么怎么判断呢?
显然这个
当然需要特判一手
时间复杂度
代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
ll T,n,a,b,flg,tmp;
inline ll read() {
ll ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-f;ch=getchar();}
while(ch>='0'&&ch<='9') {ret=(ret<<3)+(ret<<1)+ch-'0';ch=getchar();}
return ret*f;
}
void write(ll x) {
static char buf[22];static ll len=-1;
if(x>=0) {
do{buf[++len]=x%10+48;x/=10;}while(x);
}
else {
putchar('-');
do{buf[++len]=-(x%10)+48;x/=10;}while(x);
}
while(len>=0) putchar(buf[len--]);
}
void writeln(ll x) {
write(x);putchar('\n');
}
int main() {
T=read();
while(T--) {
flg=0;
n=read();a=read();b=read();
tmp=1;
if(a==1) {
if((n-a)%b==0) flg=1;
}
else
while(tmp<=n) {
if((n-tmp)%b==0) {
flg=1;break;
}
tmp*=a;
}
if(flg) printf("Yes\n");
else printf("No\n");
}
return 0;
}