数列

题目大意:给出一个等差数列的初始值和差值还有一个等比数列的处值和比值,问不大于n的数中,问这两个序列中,有多少个数小于n(只要在一个序列中就行了,在两个序列中只记一次)

样例输入

1 1 1 2 1000

样例输出

1000

数据范围限制

1≤a,b,c,upperBound≤1012, 1≤d≤105。

对于80%的数据,1≤upperBound≤1000000。

提示

【枚举】数列(jzoj 1507)

解题思路:

这道题枚举出两个序列是肯(ying)定(gai)不行的,我们可以知道,等差数列不大于n的数有(n-a)/b+1(特殊情况除外),n-a是指序列小于n的长度,除以b是总数,1是a这个数,然后枚举等比数列,判断i-a是否可以整除b,这是判断,他是否存在两个之中,存在就减去一,再加一些特判即可

#include<cstdio>
#include<iostream>
using namespace std;
long long a,b,c,d,n,ans;
int main()
{
	freopen("shulie.in","r",stdin);
	freopen("shulie.out","w",stdout);
	scanf("%lld %lld %lld %lld %lld",&a,&b,&c,&d,&n);
	if (d==1||(!d))//特判,如果因数为1或0是不会变得
	  {
	  	if ((c-a)%b!=0&&c<=n||c<a&&c<=n)//如果第一个数不在等差数列并且小于n
	  	  ans=1;//等比数列的值为1
	  }
	else
	for (long long i=c;i<=n;i*=d)//枚举等比数列
	  {
	  	ans++;//先加一
	  	if (i>=a&&(i-a)%b==0)//如果在队列内
	  	  ans--;//就减一
	  }
	if (n>=a) printf("%lld",ans+(n-a)/b+1);//如果等差数列是存在的,就加上它的值
	else printf("%lld",ans);//否则不加
	fclose(stdin);
	fclose(stdout);
	return 0;
} 

相关文章:

  • 2022-12-23
  • 2021-12-14
  • 2022-12-23
  • 2021-05-24
  • 2022-12-23
  • 2021-10-08
  • 2021-12-30
猜你喜欢
  • 2021-09-10
  • 2021-06-25
  • 2022-12-23
  • 2021-06-08
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案