【分类讨论】【set】Codeforces Round #407 (Div. 2) B. Masha and geometric depression

模拟一下那个过程,直到绝对值超过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\n",S3.size());
			}
		}
		else{
			puts("0");
		}
	}
	else{
		printf("%d\n",S3.size());
	}
	return 0;
}
posted @ 2017-03-30 10:40  AutSky_JadeK  阅读(134)  评论(0编辑  收藏  举报
TVアニメ「Charlotte(シャーロット)」公式サイト TVアニメ「Charlotte(シャーロット)」公式サイト