数列
题目大意
有一个等差数列和一个等比数列,等差数列头为a,公差为b,等比数列头为c,公倍为d ,求在 1 ~ u p p e r B o u n d 1~upperBound 1~upperBound之间有多少个数在等差数列或等比数列中,不能重复
样例输入
1 1 1 2 1000
样例输出
1000
数据范围
对于80%的数据,
1
≤
u
p
p
e
r
B
o
u
n
d
≤
1000000
1≤upperBound≤1000000
1≤upperBound≤1000000。
1
≤
a
,
b
,
c
,
u
p
p
e
r
B
o
u
n
d
≤
1012
1≤a,b,c,upperBound≤1012
1≤a,b,c,upperBound≤1012
1
≤
d
≤
105
1≤d≤105
1≤d≤105
提示
思路
这道题是关于数论的。
我们可以先判断出合法的等差和等比数列,再用ans统计,最后求出项,项的求法为:
(
首
项
(
a
)
+
尾
项
(
e
)
)
÷
b
+
1
(首项(a)+尾项(e))÷b+1
(首项(a)+尾项(e))÷b+1
那么这样就可以求出来了。
代码
#include<cstdio>
using namespace std;
long long a,b,c,d,e,ans;
int main()
{
//freopen("shulie.in","r",stdin);
//freopen("shulie.out","w",stdout);
scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&e);//读入
if (d!=1)
{
for (long long i=c;i<=e;i*=d)
if ((i-a)%b||i<a) ans++;//纪录并统计合法的数列
}
else if ((c-a)%b && c<=e || c<a && c<=e) ans=1;
if (a<=e) ans+=(e-a)/b+1;//求出项
printf("%lld",ans);//输出
fclose(stdin);
fclose(stdout);
return 0;
}