【NOIP提高组】算循环

Description

这里写图片描述

Data Constraint

这里写图片描述

Solution

从数据范围很明显可以看出满分做法应该是 O1 的,我们可以慢慢把时间优化起来。首先x、y肯定是不需要枚举的,直接换成计算。然后再假设枚举了上下界,然后推出 ij(nj+1)(mj+1) ,接着再尝试每一行计算 i(ni+1) 。同理最后的这一维可以用类似的方法消掉,消掉后再转化一下形式,变成可以直接利用等差数列和平方和进行计算的式子 (ni=1ni=1i2)(mi=1mi=1i2)

Code

const mo=1000000007;
var
    tmp,sum,ans,n,m,s1,s2,x,y,z,t:int64;
function ksc(x,y:int64):int64;
begin
    t:=trunc(sqrt(x));
    ksc:=((t*t)mod mo*(y mod mo))mod mo;
    ksc:=(ksc+((x-t*t) mod mo)*(y mod mo))mod mo;
    exit(ksc);
end;
procedure deal(re:int64);
begin
    x:=re;y:=re+1;z:=2*re+1;
    if x mod 2=0 then x:=x div 2
       else if y mod 2=0 then y:=y div 2 else z:=z div 2;
    if x mod 3=0 then x:=x div 3
       else if y mod 3=0 then y:=y div 3 else z:=z div 3;
end;
procedure doit(re:int64);
begin
    x:=re;y:=re+1;z:=re+1;
    if x mod 2=0 then x:=x div 2
       else if y mod 2=0 then y:=y div 2 else z:=z div 2;
end;
begin
    readln(n,m);
    deal(n); tmp:=ksc(x,y);tmp:=ksc(tmp,z);
    deal(m); sum:=ksc(x,y);sum:=ksc(sum,z);
    doit(n); s1:=ksc(x,y);s1:=ksc(s1,z);
    doit(m); s2:=ksc(x,y);s2:=ksc(s2,z);
    tmp:=s1-tmp; sum:=s2-sum;
    while tmp<0 do tmp:=tmp+mo;
    while sum<0 do sum:=sum+mo;
    ans:=ksc(tmp,sum);
    writeln(ans);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值