【Codeforces 258E】 Devu and Flowers
【题目链接】
http://codeforces.com/contest/451/problem/E
【算法】
容斥原理
【代码】
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int P = 1e9 + 7; int i,j,n,s,ans,MASK; ll m,t; ll a[30],f[30]; int inv[30]; inline int power(int a,int n) { int res = 1,b = a; while (n) { if (n & 1) res = 1ll * res * b % P; b = 1ll * b * b % P; n >>= 1; } return res; } inline int C(ll x,int y) { int i,res = 1; if (y < 0 || x < y || x < 0) return 0; if (x == 0 || y == 0) return 1; x %= P; for (i = x; i >= x - y + 1; i--) res = 1ll * res * i % P; for (i = 1; i <= y; i++) res = 1ll * res * inv[i] % P; return res; } int main() { scanf("%d%I64d",&n,&m); for (i = 1; i <= n; i++) scanf("%I64d",&a[i]); for (i = 1; i <= 30; i++) inv[i] = power(i,P-2); MASK = 1 << n; ans = 0; for (i = 0; i < MASK; i++) { if (i == 0) ans = (ans + C(n+m-1,n-1)) % P; else { s = 0; t = n + m; for (j = 0; j < n; j++) { if (i & (1 << j)) { s++; t -= a[j+1]; } } t -= (s + 1); if (s & 1) ans = (ans - C(t,n-1) + P) % P; else ans = (ans + C(t,n-1)) % P; } } printf("%d\n",ans); return 0; }