codeforce 789e Masha and geometric depression 暴力模拟

xiaoxiao2021-02-28  135

题意:给定一个等比数列的首项和公比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); }

转载请注明原文地址: https://www.6miu.com/read-19618.html

最新回复(0)