2015 测试赛 大神和小伙伴 hihoCoder

立方和公式和平方和公式。表示从来不记得这些公式。。。

每库礼物不同数量相同,总数=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;
}

  

原文地址:https://www.cnblogs.com/jie-dcai/p/4415210.html