Codeforce 451 E. Devu and Flowers 多重集組合數

 多重集組合數模板題。

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll inv,a[25],m;
int n;
void exgcd(ll a,ll b,ll &x,ll &y)
{
    if(!b)
    {
        x=1;
        y=0;
        return ;
    }
    exgcd(b,a%b,y,x);
    y-=(a/b)*x;
}
ll C(ll x)
{
    if(x<n-1) return 0;
    ll ans=1;
    x%=mod;
    for(int i=0;i<n-1;i++) ans=ans*(x-i)%mod;
    return ans*inv%mod;
}
int main()
{
    cin>>n>>m;
    ll x,y,jc=1;
    for(int i=1;i<n;i++) jc=jc*i%mod;
    exgcd(jc,mod,x,y);
    inv=(x%mod+mod)%mod;
    for(int i=0;i<n;i++) cin>>a[i];
    ll ans=0;
    for(int i=0;i<(1<<n);i++)//i!=(1<<n)那i就有n+1位而不是n位了
    {
        ll t=n+m-1,p=0;
        for(int j=0;j<n;j++) if(i&(1<<j))
        {
            t-=a[j];
            ++p;
        }
        t-=p;//別忘了-p
        if(p&1) ans=(ans-C(t))%mod;
        else ans=(ans+C(t))%mod;
    }
    cout<<(ans+mod)%mod<<endl;//在前面的運算每一步都有%mod時,最後即使爲負數絕對值也小於mod,不需要(ans%mod+mod)%mod
    system("pause");
}

 

發佈了74 篇原創文章 · 獲贊 4 · 訪問量 5042
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章