题目大意:
t组数据,每组数据给一个n,表示长方体最长的一条边。
L表示从一顶点到其对顶点的表面最短路程。
计算所有可能的长方体的
L2
和, 结果对1000000007取余。
t≤100,1≤n≤1014
注:(a, b, n)和(b, a, n)算重复。
思路:
1≤a≤n
,
a≤b≤n
, sum +=
(a+b)2+n2
将
(a+b)2
拆开来推。
最终为:
sum=n∗(n+1)/12∗(13∗n2+13∗n+4)
费马小定理+快速幂求12的逆元。
#include <iostream>
using namespace std;
typedef long long LL;
const int mod = 1000000007;
LL n, mon;
LL pow(LL a, LL b)
{
LL ans = 1;
while(b)
{
if(b&1)
{
ans *= a;
ans %= mod;
}
a *= a;
a %= mod;
b >>= 1;
}
return ans;
}
int main(int argc, char const *argv[])
{
LL t;
mon = pow(12, mod-2);
cin >> t;
while(t--)
{
cin >> n;
LL ans = 13 * n % mod * (n % mod) % mod + 13 * n % mod + 4;
ans %= mod;
ans *= (n + 1) % mod * (n % mod) % mod * mon % mod;
ans %= mod;
cout << ans << endl;
}
return 0;
}