VJ链接:https://cn.vjudge.net/problem/CodeForces-789B
题目大意:给定一个等比数列的首项和公比(b和q都可能为0)b和q,一个上限l,一个m,接下来给m个数a1,a2······am
求出满足下列条件的bk的个数
1.bk(数列b的第k项)要不大于上线l
2.bk不在a1~am里面
思路:用set存储a1~am,这样查找bk时就可以用set的成员函数find()了,用ans记录个数
注意注意注意:
1.b一开始就大于l的情况(这种情况我一开始没想到,WA了好多发)
2.b==0的情况
3.q==0
4.q==1
5.q==-1
只要考虑了以上情况,就可以AC了
代码:
#include<iostream>
#include<algorithm>
#include<set>
#include<cstdio>
using namespace std;
set<int> a;
int main()
{
long long b,q,l,m,x;
while(scanf("%lld %lld %lld %lld",&b,&q,&l,&m)!=EOF)
{
int ans=0;
a.clear();
for(long long i=0;i<m;i++)
{
scanf("%lld",&x);
a.insert(x);
}
if(abs(b)>l)
{
cout<<"0"<<endl;
continue;
}
if(b==0)
{
if(a.find(b)!=a.end())
cout<<"0"<<endl;
else
cout<<"inf"<<endl;
continue;
}
if(q==1)
{
if(a.find(b)!=a.end())
cout<<"0"<<endl;
else
cout<<"inf"<<endl;
continue;
}
else if(q==-1)
{
if(a.find(b)!=a.end()&&a.find(b*-1)!=a.end())
cout<<"0"<<endl;
else
cout<<"inf"<<endl;
continue;
}
else if(q==0)
{
if(a.find(0)!=a.end()&&a.find(b)!=a.end())
cout<<"0"<<endl;
else if(a.find(0)!=a.end())
cout<<"1"<<endl;
else
cout<<"inf"<<endl;
continue;
}
else
{
while(abs(b)<=l)
{
if((a.find(b)==a.end()))
ans++;
b*=q;
}
cout<<ans<<endl;
}
}
return 0;
}
嘛,其实还有一种写法。首先求出使得bn<=l的最大n,接着,如果ak%b==0&&ak/b<=n,则这个ak不满足条件,记录ak的个数,最后只要用总的个数n减去上面的个数即可,当然啦,特除情况还是要考虑的