51nod1269Devu and Flowers

题解:

如果没有限制每一种花有多少,那么就是简单的排列组合问题。

那么我们强制让一些花一定都要选。

暴力搜索,然后组合数(逆元)

采用容斥原理来计算最后的答案

代码:

#include<bits/stdc++.h>
using namespace std;
const int M=1e9+7;
typedef long long ll;
ll i,j,k,l,t,n,m,ans,a[27],er[27],bz,sum;
ll ksm(ll x,ll y)
{
    ll z=1;
    for(;y;y/=2,(x*=x)%=M)
     if(y&1)(z*=x)%=M;
    return z;
}
ll js(ll x,ll y)
{
    if(x<y)return 0;
    ll a=1,b=1,i;
    if(y<x-y)y=x-y;
    for (int i=y+1;i<=x;i++)a=a*i%M;
    for (int i=2;i<=x-y;i++)b=b*i%M;
    return a*ksm(b,M-2)%M;
}
ll c(ll x,ll y)
{
    if(!y)return 1;
    return c(x/M,y/M)*js(x%M,y%M)%M;
}
int main()
{
    scanf("%lld%lld",&n,&m);
    for (int i=1;i<=n;i++)scanf("%lld",&a[i]);
    for (int i=0;i<(1<<n);i++)
     {
        bz=1;sum=m;
        for (int j=1;j<=n;j++)
         if(i&(1<<(j-1)))
            {
            bz*=-1;
            sum-=a[j]+1;
          }
        if(sum<0)continue;
        (ans+=bz*c(n+sum-1,n-1))%=M;
     }
    ans=(ans+M)%M;
    printf("%lld
",ans);
}
原文地址:https://www.cnblogs.com/xuanyiming/p/7511773.html