编程之美,大神和它的三个小伙伴

/*题目2 : 大神与三位小伙伴
时间限制:2000ms
单点时限:1000ms
内存限制:256MB
描述
L国是一个有着优美景色且物产丰富的国家,很多人都喜欢来这里旅游并且喜欢带走一些纪念品,大神同学也不例外。距离开L国的时间越来越近了,大神同学正在烦恼给她可爱的小伙伴们带什么纪念品好,现在摆在大神同学面前的有三类纪念品A, B, C可以选择,每类纪念品各有N种。其中种类为A_i, B_i, C_i的纪念品价值均为i, 且分别有N+1-i个剩余。现在大神同学希望在三类纪念品中各挑选一件然后赠送给她的三名可爱的小伙伴,但是她又不希望恰好挑出来两件价值相同的纪念品,因为这样拿到相同价值纪念品的两位小伙伴就会认为大神同学偏袒另一位小伙伴而不理睬她超过一星期。现在,大神同学希望你买到的三件纪念品能让三位小伙伴都开心并且不和她闹别扭,她想知道一共有多少种不同挑选的方法?

因为方案数可能非常大,大神同学希望知道挑选纪念品的方案数模10^9+7之后的答案。
输入第一行包括一个数T,表示数据的组数。接下来包含T组数据,每组数据一行,包括一个整数N。输出对于每组数据,输出一行“Case x: ”,其中x表示每组数据的编号(从1开始),后接一个数,表示模10^9+7后的选择纪念品的方案数。数据范围小数据:1<=T<=101<=N<=100大数据:1<=T<=10001<=N<=10^18

*/


/*题目不难只要能够求出方案数的公式就可以解了方案数为
 s=(n*(n+1)/2)^3-3*sum(i*i*((1+n)*n/2-i)) 1<=i<=n
 化简后为 s=n^2*(n+1)^2*(n*(n-3)+4)/8;
 剩下的就是怎么算了。。。不难吧*/




#include <iostream>
using namespace std;
const long long mod=1e9+7;
typedef long long LL;
int main()
{
    int T,n=0;cin>>T;
    while(n++<T)
    {
        LL temp,m,ans=1;
        cin>>temp;
        if(temp&1)
        {
            ans*=(temp+1)/2;
            ans%=mod;
            ans*=ans;
            ans%=mod;
            m=(temp-3)/2;
            m%=mod;
            m*=(temp%mod);
            m%=mod;
            m+=2;
            m%=mod;
            ans*=m;
            ans%=mod;
            ans*=(temp%mod);
            ans%=mod;
            ans*=(temp%mod);
            ans%=mod;

        }
        else
        {
            ans*=(temp/2);
            ans%=mod;
            ans*=ans;
            ans%=mod;
            m=temp/2;
            m%=mod;
            m*=((temp-3)%mod);
            m%=mod;
            m+=2;
            m%=mod;
            ans*=m;
            ans%=mod;
            ans*=(temp+1)%mod;
            ans%=mod;
            ans*=(temp+1)%mod;
            ans%=mod;

        }
        ans=(ans+mod)%mod;
        cout<<"Case "<<n<<": ";
        cout<<ans<<endl;
    }
    return 0;
}

    原文作者:hikean
    原文地址: https://blog.csdn.net/hikean/article/details/23554119
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞