题目链接:
题意:
告诉你一个长方体的最长边,从任意一个顶点走到与其不在长方体同一个表面上的顶点求这个最短距离 ΣL2 。
分析:
- 公式推导
设最长的边为 n ,最短的边为 x ,次短的边为 y ,
ΣL2=∑nx=1∑ny=xn2+(x+y)2
ΣL2=n∗(n+1)/2∗n2+∑nx=1∑ny=xx2+y2+2∗x∗y
设 Sum1=∑nx=1∑ny=x2∗x∗y
Sum1=∑nx=12∗x∑ny=xy
Sum1=∑nx=12∗x∗(x+n)∗(n−x+1)/2
Sum1=∑nx=span class="mn" id="MathJax-Span-2751" style="font-size: 70.7%; font-family: MathJax_Main;">1−x3+x2+(n2+n)∗x
设 Sum2=∑nx=1∑ny=xx2+y2 由于 x,y 的取值范围都为 [1,n] ,并且每个数的平方都恰好出现了 n+1 次
因此 Sum2=∑nx=1x2∗(n+1)
ΣL2=Sum1+Sum2=∑nx=1−x3+(n+2)∗x2+(n2+n)∗x - 补充三个求和公式:
∑nx=1x=n∗(n+1)/2
∑nx=1x2=n∗(n+1)∗(2∗n+1)/6
∑nx=1x3=[n∗(n+1)/2]2
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod = 1e9+7;
LL n;
LL quick_mod(LL a,LL b){
LL ans = 1;
while(b){
if(b&1)
ans = ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
int main()
{
LL inv2 = quick_mod(2LL,mod-2);
LL inv4 = quick_mod(4LL,mod-2);
LL inv6 = quick_mod(6LL,mod-2);
int t;
cin>>t;
while(t--){
cin>>n;
n%=mod;
LL ans = n%mod*(n+1)%mod*inv2%mod*n%mod*n%mod;
ans =(ans -n*n%mod*(n+1)%mod*(n+1)%mod*inv4+mod)%mod;
ans =(ans+(n+2)*n%mod*(n+1)%mod*(2*n+1)%mod*inv6)%mod;
ans =(ans+(n*n%mod+n)%mod*n%mod*(n+1)%mod*inv2)%mod;
cout<<ans<<endl;
}
return 0;
}