立方和公式和平方和公式。表示从来不记得这些公式。。。
每库礼物不同数量相同,总数=1+2+...+n=(n+1)*n/2
选取礼物的可能性的最大值为[(n+1)*n/2]^3
选取礼物价值重复两次的总数3*(1^2+2^2+...+n^2)*(1+2+...+n)=3*[n*(n+1)*(2*n+1)/6]*[(n+1)*n/2]=n^2*(n+1)^2*(2*n+1)/4=[n*(n+1)/2]^2*(2*n+1)
选取礼物价值重复三次的总数1^3+2^3+...+n^3=[n*(n+1)/2]^2
题目中的情况是总数-重复两次+重复三次的(因两次中的公式包含了一个三次的)
[(n+1)*n/2]^2*(n^2-3*n+4)/2%MAX
对于前一个平方式子,可以直接把2除去。对于后一个2,n(n-3)也可以除去。
#include <iostream> using namespace std; long long T,n; long long tmp,temp,result,ans; long long MAX = 1e9 + 7; int main() { cin >> T; for(long long i = 0; i < T; i++) { cin >> n; cout << "Case " << i+1 << ": "; if(n%2==0) { tmp = n / 2 % MAX; temp = (n + 1) % MAX; result= ((tmp*((n-3)%MAX))%MAX+2)%MAX; }else { tmp = n % MAX; temp = (n + 1) / 2 % MAX; result=((((n-3)/2 %MAX)*n)%MAX+2)%MAX; } ans =( ((tmp * temp % MAX)*(tmp * temp % MAX))%MAX*result)%MAX; cout << ans << endl; } return 0; }