Problem
Description
Input
Output
Sample Input
167 198
Sample Output
906462341
Data Constraint
Solution
我们一步一步思考。
20分的答案已经给出来了。
那么将20分转化为40分只需要将最后两层循环简化掉。
接下来,我们将剩下的4重循环的顺序重新排列。然后分成两组。
i,k
为1组,
j,l
为1组。
假设
i,k
循环答案为
t1
,
j,l
循环答案为
t2
,总答案为
t1∗t2
.
最后简化为:
t1=Σn1i(i+1)2
,
t2=Σm1i(i+1)2
然后可以拆成
t1=Σn1i2+i2
,
t2=Σm1i2+i2
然后套平方和等公式就可以AC。
Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#define LL long long
#define mo 1000000007
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
LL n,m,i,j,k,l,x,y,tmp,t1,t2;
LL gsq(LL n)
{
LL t;n=n%mo;
t=((n+1)*n)%mo;t=(t*((2*n+1)%mo))%mo;t=(t*166666668)%mo;
return t;
}
LL get(LL n)
{
LL t;n=n%mo;
t=((n+1)*n)%mo;t=(t*500000004)%mo;
return t;
}
int main()
{
scanf("%lld%lld",&n,&m);
n=n%mo;m=m%mo;
t1=(((gsq(n)+get(n))%mo)*500000004)%mo;
t2=(((gsq(m)+get(m))%mo)*500000004)%mo;
tmp=(t1*t2)%mo;
printf("%lld",tmp);
}