题解:
如果没有限制每一种花有多少,那么就是简单的排列组合问题。
那么我们强制让一些花一定都要选。
暴力搜索,然后组合数(逆元)
采用容斥原理来计算最后的答案
代码:
#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); }