模拟一下那个过程,直到绝对值超过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 ",S3.size()); } } else{ puts("0"); } } else{ printf("%d ",S3.size()); } return 0; }