模拟一下那个过程,直到绝对值超过l,或者出现循环为止。
如果结束之后,绝对值是超过l的,就输出当前写在黑板上的数量。
如果出现循环,则如果写在黑板上的数量非零,则输出inf(注意!如果陷入的循环是一个全部被禁止的循环,但是黑板上有输出的值,则还是应该输出黑板上的值的数量。这种情况用循环再向后扫几项判一下即可。),否则输出0。
用三个set处理。
#include<cstdio>
#include<set>
using namespace std;
typedef long long ll;
ll Abs(ll x){
return x<0 ? (-x) : x;
}
int b1,q,l,m,a[100100];
set<int>S,S2,S3;
int main(){
// freopen("b.in","r",stdin);
scanf("%d%d%d%d",&b1,&q,&l,&m);
for(int i=1;i<=m;++i){
scanf("%d",&a[i]);
S.insert(a[i]);
}
ll b=b1;
while(1){
if(Abs(b)>(ll)l || S2.find(b)!=S2.end()){
break;
}
S2.insert(b);
if(S.find(b)==S.end()){
S3.insert(b);
}
b*=(ll)q;
}
if(Abs(b)<=(ll)l){
if(S3.size()){
bool flag=0;
for(int i=1;i<=100000;++i){
b*=(ll)q;
if(S.find(b)==S.end()){
flag=1;
break;
}
S3.erase((int)b);
}
if(flag){
puts("inf");
}
else{
printf("%d\n",S3.size());
}
}
else{
puts("0");
}
}
else{
printf("%d\n",S3.size());
}
return 0;
}