BZOJ 3027: [Ceoi2004]Sweet
容斥
#include<cstdio> using namespace std; int a,b,n,m[15]; long long ans=0,mod=2004; long long C(int n,int m){ long long ans=1; for (int i=n; i>=n-m+1; i--) ans=ans*i%mod; return ans; } void dfs(int t,int lim,int cas){ if (lim<0) return; if (t>n){ ans+=1ll*cas*C(lim+n,n); ans%=mod; ans+=mod; ans%=mod; return; } dfs(t+1,lim,cas); dfs(t+1,lim-m[t]-1,-cas); } long long solve(int lim){ ans=0; dfs(1,lim,1); for (int i=1; i<=n; i++) ans/=i; return ans; } int main(){ scanf("%d%d%d",&n,&a,&b); for (int i=1; i<=n; i++) scanf("%d",&m[i]); for (int i=1; i<=n; i++) mod*=i; printf("%lld\n",(solve(b)-solve(a-1)+2004)%2004); return 0; }