http://codeforces.com/contest/789/problem/B
给定你四个数,b,q,limt,m;然后再给你m个数;
b,q构造成一个 数列 b,b*q,b*q*q,(等比数列),最大的数的绝对值不会大于limit的绝对值,然后给你m个数,是一个数组,如果这个有限的数列内的值没在这个数组中,那么就可以输出这个数,输出能输出的数的个数,如果可以输出很多,那么就用inf;
从他找一个数组来判断是否存在,就可以用map了。。然而没有想到,开始只是用一个标志变量来判断是否存在0.。
并且要模拟出 五种情况
1 b=0,那么这时候只会包含0;
如果包含0,那么就是0,否则就是1;
2 q=1,那么只会包含b。
如果包含b,那么就是0,否则是inf;
3 q=-1,那么只会包含b 和-b;
如果包含b和-b,那么就是0;
否则就是inf,
4 q=0,那么会输出 b,0,0,0….
出过没有0,那么就是inf。
如果有b并且有0,那么就是0;
否则是1;
5 还要保证的 是 b的绝对值要小于等于limit,否则的话就是0,
l>0;
详情见代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cstring>
using namespace std;
const int maxn=100006;
int main()
{ long long b,q,limit,m;
long long a[maxn];
map<int ,int >s;
//memset(s,0,sizeof(s));
scanf("%lld%lld%lld%lld",&b,&q,&limit,&m);
for(int i=1;i<=m;i++)
{scanf("%lld",&a[i]);
s[a[i]]++;
//check[abs(a[i])]=1;
}
//for(int i=1)
//sort(a+1,a+m+1);
if(q==0)
{
if(abs(limit)>=abs(b))
{ if(s[0]==0)
{printf("inf\n");
return 0;}
else if(s[0]>0&&s[b]==0)
{ printf("1\n");
return 0;
}
else
{ printf("0\n");
return 0;
}
}
else {printf("0\n");return 0;}
}
if(q==1)
{ if(abs(limit)>=abs(b))
{ if(s[b]==0)
{ printf("inf\n");
return 0;
}
else
{ printf("0\n");
return 0;
}
}
else
{printf("0\n");
return 0;
}
}
if(b==0)
{ if(s[0]>0)
{printf("0\n");
return 0;
}
else
{ printf("inf\n");
return 0;
}
}
if(q==-1)
{ if(abs(limit)>=abs(b))
{ if(s[b]>0&&s[-b]>0)
printf("0\n");
else
printf("inf\n");
return 0;
}
else
{printf("0\n");
return 0;
}
}
if(abs(b)>abs(limit))
{ printf("0\n");
return 0;
}
long long st=b;
int sum=0;
while(abs(st)<=abs(limit))
{ if(s[st]==0) sum++;
st*=q;
}
printf("%d\n",sum);
return 0;
}