题意:给定一个等比数列的首项和公比b,q,(b和q都可以为0),另外给定一个数L,和m个数a[m],从首项开始计数,如果其绝对值小于等于L,则加1,然后取第二项,拿第二项当首项继续计数,直到b>L,将技术结果输出,如果有无数个,输出inf
思路:分情况,输出。
如果abs(b)>l直接判断为0.
剩下的是b<=l,如果q=1,数列全部为b,判断b是否存在“bad”数组里,不存在则有无穷个,存在之有0个
q=-1,数列为b和-b,都有无穷个,同理只要有一个不存在“bad”数组里,就有无穷个,否则有0个
q=0,b!=0 数列含有无穷个0,和一个b。
b=0,数列含有无穷个0.
剩下的暴力解,每次取一项判断绝对值是否满足条件。直到退出。
我竟然忘了有map这个东西,还在想1e9数组开不下,只能靠模拟 =_=,还有就是b要声明为long long,因为int会溢出
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
map<long long,int> mm;
long long Abs(long long a){if(a<0)a=-a;return a;}
int main()
{
//freopen("in.txt","r",stdin);
int q,l,m,a;
long long b;
scanf("%lld%d%d%d",&b,&q,&l,&m);
for(int i=0;i<m;i++)
{
scanf("%d",&a);
mm[a]=1;
}
int cur=b,cnt=0;
if(Abs(b)>l)
{
printf("0\n");
return 0;
}
//|b|<=l
if(q==1)
{
if(mm[b]==0)printf("inf\n");
else printf("0\n");
return 0;
}
if(q==-1)
{
if(mm[b]&&mm[-b])printf("0\n");
else printf("inf\n");
return 0;
}
if(q==0&&b!=0)
{
if(mm[b]&&mm[0])printf("0\n");
else if(mm[0]==0)printf("inf\n");
else if(mm[b]==0)printf("1\n");
return 0;
}
if(b==0)
{
if(mm[0]==1)printf("0\n");
else printf("inf\n");
return 0;
}
while(Abs(b)<=l)
{
if(mm[b]==0)
cnt++;
b=b*q;
}
//infinite q>0 b<0 && b < l
printf("%d\n",cnt);
}

本文介绍了一种针对特定条件下的等比数列计数算法。该算法根据首项和公比的不同情况,判断数列中满足条件的项的数量,并通过使用map来存储‘bad’数组以避免数组开辟过大问题。
1698

被折叠的 条评论
为什么被折叠?



