1. 程式人生 > >Codeforces 451E Devu and Flowers【容斥原理+盧卡斯定理】

Codeforces 451E Devu and Flowers【容斥原理+盧卡斯定理】

d+ 題意 while markdown post mark 色相 esp printf

題意:每個箱子裏有\( f[i] \)種顏色相同的花,現在要取出\( s \)朵花,問一共有多少種顏色組合
首先枚舉\( 2^n \)種不滿足條件的情況,對於一個不被滿足的盒子,我們至少拿出\( f[i]+1 \)朵花。
然後進行容斥,不滿足奇數個條件的減去,不滿足偶數個條件的加上

#include<iostream>
#include<cstdio>
using namespace std;
const int N=25,mod=1e9+7;
int n;
long long s,f[N];
long long ksm(long long a,long long b)
{
    long
long r=1ll; while(b) { if(b&1) r=r*a%mod; a=a*a%mod; b>>=1; } return r; } long long C(long long a,long long b) { if(a<b) return 0; b=(b>a-b)?a-b:b; long long u=1ll,d=1ll; for(long long i=0;i<b;i++) { u=u*(a-i)%mod; d=d*(i+1
)%mod; } return u*ksm(d,mod-2)%mod; } long long lucas(long long a,long long b) { return !b?1:C(a%mod,b%mod)*lucas(a/mod,b/mod)%mod; } int main() { scanf("%d%I64d",&n,&s); for(int i=1;i<=n;i++) scanf("%I64d",&f[i]); long long ans=0ll; for(int i=0;i<(1
<<n);i++) { long long t=1ll,sum=s; for(int j=1;j<=n;j++) if(i&(1<<(j-1))) { sum-=f[j]+1; t*=-1; } if(sum<0) continue; ans+=t*lucas(sum+n-1,n-1); } printf("%I64d\n",(ans%mod+mod)%mod); return 0; }

Codeforces 451E Devu and Flowers【容斥原理+盧卡斯定理】