jzoj3327. 陶陶的難題
阿新 • • 發佈:2018-12-13
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.