算循环
题目大意
求
n
*
数据范围
题解
首先考虑矩阵的横向长度,如果为i,那么有(m-i+1)的选择位置,则横向长度的总贡献为
∑mi=1
i*(
m
-
那现在时间复杂度为
设
易得
Fn
=
Fn−1
+
n2
+
n
,所以
=n∗(n+1)∗(2∗n+1)6 +
n∗(n+1)2
这样就可以O(1)求出答案了。(除法用逆元)
Code(Pascal)
const
mo=1000000007;
var
i,l:longint;
ans,n,k,m,n2,n6:int64;
function ksm(o,k:int64):int64;
begin
ksm:=1;
while k>0 do
begin
if k mod 2=1 then ksm:=ksm*o mod mo;
o:=o*o mod mo;
k:=k div 2;
end;
end;
begin
readln(n,m);
ans:=0;
k:=0;
n:=n mod mo;
m:=m mod mo;
n2:=ksm(2,mo-2);
n6:=ksm(6,mo-2);
k:=(n*(n+1) mod mo)*n2 mod mo;
k:=k+((n*(n+1) mod mo)*(2*n+1) mod mo)*n6 mod mo;
k:=k*n2 mod mo;
ans:=(m*(m+1) mod mo)*n2 mod mo;
ans:=ans+((m*(m+1) mod mo)*(2*m+1) mod mo)*n6 mod mo;
ans:=ans*n2 mod mo;
ans:=ans*k mod mo;
writeln(ans);
end.