设最长边Z,最短边X,次长边Y,可以枚举所有的组合
Z | X | Y |
---|---|---|
3 | 1 | 1 |
3 | 1 | 2 |
3 | 1 | 3 |
3 | 2 | 2 |
3 | 2 | 3 |
3 | 3 | 3 |
易得,
Sum=∑x=1n∑y=xn[z2+(x+y)2](1)
将 z2 提出,右边分解,可得
Sum1=12n(n+1)⋅z2(2)
Sum2=∑x=1n∑y=xn(x2+y2+2xy)(3)
3式右边可继续分解成两项
Sum3=∑x=1n∑y=xn(x2+y2)(4)
Sum4=∑x=1n∑y=xn2xy(5)
其中4式可约简(观察或数学证明都可得)
Sum3=(n+1)∑x=1nx2(6)
5式(有一个交换变量的技巧)
Sum4=∑x=1nx∑y=xn2y=∑x=1nx∑y=1x2y=∑x=1nx⋅x(x+1)=∑x=1n(x3+x2)(7)
这样就很清楚了,利用立方和和平方和的数列公式得解。
∑x=1nx2=16n(n+1)(2n+1)
∑x=1nx3=14n2(n+1)2
1/6的处理时候使用逆元 1/a=ap−2
贴一下代码
LL mod(LL x, LL k)
{
LL ans = 1;
while(k)
{
if(k & 1)
ans = ans * x % MOD;
k >>= 1;
x = x * x % MOD;
}
return ans;
}
void cd_test()
{
LL n;
scanf("%lld", &n);
n %= MOD;
LL inv2 = mod(2LL, MOD - 2);
LL inv4 = mod(4LL, MOD - 2);
LL inv6 = mod(6LL, MOD - 2);
LL n2 = n * n % MOD;
LL s1 = inv2 * n % MOD * (n + 1) % MOD;
LL s2 = inv6 * n % MOD * (n + 1) % MOD * (2LL * n + 1) % MOD;
LL s3 = inv4 * n2 % MOD * (n + 1) % MOD * (n + 1) % MOD;
LL c1 = n2 * s1 % MOD;
LL c2 = (n + 1) * s2 % MOD;
LL c3 = (s2 + s3) % MOD;
LL ans = ((c1 + c2) % MOD + c3) % MOD;
printf("%lld\n", ans);
}