题意
给定 \(n\) 种球,第 \(i\) 种球有 \(m_i\) 个,你现在要在第 \(i\) 种球中选择 \(n_i\le m_i\) 个,使得 \(a\le\sum n_i\le b\),答案对 \(2004\) 取模。
\(n\le 10,m_i\le 10^6,b\le 10^7\)
分析
入门生成函数题。
将第 \(i\) 种球的取球方案写成生成函数的形式:
\[F(x)=1+x+x^2+\cdots+x^m,xF(x)+1-x^{m+1}=1+x+x^2+\cdots+x^m
\]
\[F(x)=\dfrac{1-x^{m+1}}{1-x}
\]
而最终的答案多项式显然 \(G=\prod F_i=\dfrac{\prod_i (1-x^{m_i+1})}{(1-x)^n}\)。
由于 \(n\) 只有 \(10\),所以分子可以 dfs \(O(2^n)\) 暴力展开。分母用广义二项式定理展开:
\[(1-x)^{-n}=\sum_{i\ge 0}\dbinom{-n}{i}(-1)^ix^i=\sum_{i\ge 0}\dfrac{(n+i-1)!}{i!(n-1)!}(-1)^{i}(-1)^ix^i=\dbinom{n+i-1}{n-1}x^i
\]
那么枚举分子的某一项 \(x^k\),设它的系数是 \(f_k\),那么这一项对答案的贡献就是 \(f_k\sum_{i=a-k}^{b-k}\binom{n+i-1}{n-1}=f_k(\binom{n+b-k}{n}-\binom{n+a-k-1}{n})\)。
问题转化为求组合数。然而,模数 \(2004\) 并非质数,虽然可以 exLucas 求解,但我们有另外一种做法:
\[\dbinom{n+b-k}{n}=\dfrac{(n+b-k)!}{n!(b-k)!}=\dfrac{(b-k+1)(b-k+2)\cdots(b-k+n-1)(b-k+n)}{n!}
\]
而我们有如下结论:若 \(b|a\),则 \(\dfrac{a}{b}\bmod p=\dfrac{a\bmod(p*b)}{b}\)。
那么,由于 \(n\) 只有 \(10\),所以完全可以套用这个结论,算上面这东西模 \(2004\cdot n!\) 的结果后在除掉 \(n!\),单次算上面这个东西的复杂度是 \(O(n)\) 的,所以最终总复杂度是 \(O(2^nn)\)。
int n,a,b,m[11];
int p,fac;
int ans;
int C(int x,int y){if(x<y||y<0)return 0;int res=1;rep(i,y+1,x)res=res*i%p;res/=fac;return res%mod;
}
void dfs(int step,int k,int fir){if(step==n+1){int res=(C(n+b-k,b-k)-C(n+a-k-1,a-k-1)+mod)%mod;adder(ans,res*fir%mod);return;}dfs(step+1,k,fir);dfs(step+1,k+m[step]+1,mod-fir);
}
inline void solve_the_problem(){n=rd(),a=rd(),b=rd();fac=1;rep(i,1,n)m[i]=rd(),fac*=i;p=mod*fac;dfs(1,0,1);write(ans);
}