jzoj3327. 陶陶的难题

Description

陶陶给Crash出了一个大难题,他要求Crash计算出下面式子的值:
x=LRAx+CB\sum_{x=L}^R\lfloor \frac{Ax+C}{B}\rfloor
其中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.
posted @ 2018-12-13 12:20  RainbowCrown  阅读(191)  评论(0编辑  收藏  举报