Description
陶陶给Crash出了一个大难题,他要求Crash计算出下面式子的值:
其中A,B,C,L,R均为给定正整数。由于答案可能会很大,你只需要输出答案mod 1,000,000,007后的值。
Input
输入文件名为 task . in,共一行,包含五个正整数A,B,C,L,R(L<=R)。
Output
输出文件名为 task . out,共一行,包含一个非负整数,表示答案。
Sample Input
2 3 1 1 3
Sample Output
9
Data Constraint
对于30%的数据满足 R-L<=10^6
对于100%的数据满足 A,B,C,L,R<=10^9
题解
我们可以直接看到:
https://blog.csdn.net/HiChocolate/article/details/84887553
代码
type
new=record
f,g,h:longint;
end;
var
i,j,k,n,m:longint;
answer,a,b,c,l,r:int64;
mo:int64=1000000007;
ni2:int64=500000004;
ni6:int64=166666668;
ans:new;
function likegcd(a,b,c,n:int64):new;
var
now,last:new;
op1,op2,op3,m,t,p,e,h,qh:int64;
begin
if a=0 then
begin
likegcd.f:=0;likegcd.g:=0;likegcd.h:=0;
exit;
end
else
begin
if (a>=c) or (b>=c) then
begin
last:=likegcd(a mod c,b mod c,c,n);
h:=a div c;
e:=b div c;
now.f:=(n+1)*n mod mo*h mod mo*ni2 mod mo;
now.f:=(now.f+e*(n+1) mod mo) mod mo;
now.f:=(now.f+last.f) mod mo;
now.g:=(h*n mod mo*(n+1) mod mo*(2*n+1) mod mo*ni6 mod mo);
now.g:=(now.g+e*(n+1) mod mo*n mod mo*ni2 mod mo) mod mo;
now.g:=(now.g+last.g) mod mo;
now.h:=h*h mod mo*n mod mo*(n+1) mod mo*(2*n+1) mod mo*ni6 mod mo;
now.h:=(now.h+e*e mod mo*(n+1) mod mo) mod mo;
now.h:=(now.h+e*h mod mo*n mod mo*(n+1) mod mo) mod mo;
now.h:=(now.h+2*h mod mo*last.g mod mo) mod mo;
now.h:=(now.h+2*e mod mo*last.f mod mo) mod mo;
now.h:=(now.h+last.h) mod mo;
end
else
begin
m:=((a*n)+b) div c;
last:=likegcd(c,c-b-1,a,m-1);
now.f:=(n*m mod mo-last.f+mo) mod mo;
now.g:=((n+1)*n mod mo*m mod mo-last.f-last.h+mo) mod mo;
now.g:=(now.g*ni2) mod mo;
now.h:=(n*m mod mo*(m+1) mod mo-2*last.f+2*mo-2*last.g+2*mo-now.f+mo) mod mo;
end;
exit(now);
end;
end;
begin
assign(input,'task.in');reset(input);
assign(output,'task.out');rewrite(output);
readln(a,c,b,l,r);
ans:=likegcd(a,b,c,r);
answer:=answer+ans.g;
ans:=likegcd(a,b,c,l-1);
answer:=(answer-ans.g+2*mo) mod mo;
writeln(answer);
end.