Color

C - Color

参考:CF GYM 100548 Color(2014ACM西安现场赛Problem F) Codeforces Gym 100548F Color (组合数+容斥)

思路:可以参考第一个博客的思路,很容易理解

需要注意的地方:因为数据很大所以一不小心就会爆,所以最好都用 long long

ll ans=0;
        int flag=1;
        for(int i=k;i>=1;i--)
            ans=(ans+(1ll*flag*i*qpow(i-1,n-1)%mod*c[i]%mod)+mod)%mod,flag=-flag;
            /*这个地方如果不乘1ll就会爆,如果不乘1ll的话,因为flag是int,所以乘起来就是按int来乘的*/

代码:

// Created by CAD on 2019/8/11.
#include <bits/stdc++.h>
using namespace std;
using pii=pair<int, int>;
using piii=pair<pair<int, int>, int>;
using ll=long long;
const int mod= 1e9+7;
const int maxn=1e6+5;
int c[1000005];
int inv[1000005];

ll qpow(ll x,ll n)
{
    ll re=1;
    while(n>0)
    {
        if(n&1) re=(re*x)%mod;
        n>>=1;
        x=x*x%mod;
    }
    return re;
}
void init_inv()
{
    inv[1]=1;
    for(int i=2;i<maxn;++i)
        inv[i]=ll(mod-mod/i)*inv[mod%i]%mod;
}
int k;
void init_C(ll n)
{
    c[0]=1;
    for(int i=1;i<=k;++i)
        c[i]=c[i-1]*(n-i+1)%mod*inv[i]%mod;

}
ll n,m;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    init_inv();
    int t; cin>>t;
    for(int Case=1;Case<=t;Case++)
    {
        cin>>n>>m>>k;
        init_C(k);
        ll ans=0;
        int flag=1;
        for(int i=k;i>=1;i--)
            ans=(ans+(1ll*flag*i*qpow(i-1,n-1)%mod*c[i]%mod)+mod)%mod,flag=-flag;
        init_C(m);
        cout<<"Case #"<<Case<<": "<<ans*c[k]%mod<<endl;
    }
    return 0;
}
posted @ 2019-08-11 12:42  caoanda  阅读(182)  评论(0编辑  收藏  举报