CodeForces - 789B

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减去上面的个数即可,当然啦,特除情况还是要考虑的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值