题目描述
给定一个等差数列,第一项是a, 从第二项开始,每项与前一项的差都是一个定值b。如果用数学形式来表示,那么可以表示成 a + b × x , 其中 x≧0,且是整数。例如: a = 1, b=2, 那么这个等差数列就是:1,3,5,7,9…
再给定一个等比数列,第一项是c, 从第二项开始,每项是前一项的d倍。如果用数学形式来表示等比数列,则是 c ×(dy)。 其中 y≧0, 且是整数。例如: c = 2, d = 3, 那么这个等比数列就是:2,6,18,54…
你的任务是计算在1至upperBound内的正整数,有多少正整数是“合法”的?
所谓的“合法”是指:该整数属于上面给定的等差数列的某项或者属于等比数列的某项,或者既属于等差数列的项也属于等比数列的项。
输入
一行,5个整数,分别是a,b,c,d,upperBound。
(1≤a,b,c,upperBound≤1012, 1≤d≤105。)
对于80%的数据,1≤upperBound≤1000000。
输出
一个整数,表示“合法”正整数的个数。
样例输入
1 1 1 2 1000
样例输出
1000
作者思路:先求出等差的合法个数,再求等比数列
代码:
var fuck,a,b,c,d,n,ans,l:int64;
begin
assign(input,'1.in');
assign(output,'1.out');
reset(input);
rewrite(output);
randomize;
read(a,b,c,d,n);
ans:=n-a;
ans:=ans div b;
ans:=ans+1;
if n<a then ans:=0;
l:=c;
if d=1 then
begin
if ((l-a)mod b<>0)or(l<a) then
if l<=n then inc(ans);
write(ans);
halt;
end;
while l<=n do
begin
if ((l-a) mod b<>0)or(l<a) then
begin
if l<=n then
inc(ans);
end;
l:=l*d;
end;
writeln(ans);
close(input);
close(output);
end.