bzoj 3028 食物
题目大意:
要带k种东西分别满足如下条件
物品1:偶数个
物品2:0个或1个
物品3:0个,1个或2个
物品4:奇数个
物品5:4的倍数个
物品6:0个,1个,2个或3个
物品7:不超过一个
物品8:3的倍数个
思路:
把这些物品都写成生成函数形式 得 $$(1+x^2+x^4+...) \times (1+x) \times (1+x+x^2) \times (x+x^3+x^5+...) \times (1+x^4+x^8+...) \times (1+x+x^2+x^3) \times (1+x) \times (1+x^3+x^6+...)$$
进而得 $$( \frac{1}{1-x^2}) \times (1+x) \times (\frac{1-x^3}{1-x}) \times (\frac{x}{1-x^2}) \times (\frac{1}{1-x^4}) \times (\frac{1-x^4}{1-x}) \times (1+x) \times (\frac{1}{1-x^3})$$
化简得$\frac{x}{(1-x)^4}$,我们需要求$x^n$这一项的系数,接下来两种操作
法1:将式子展开得到$x \times (1+x+x^2+...)^4$
则相当于求将$n-1$划分成四个自然数的方案数 考虑在$n$个空里插三个板 答案为$C_{n+2}^3$
法2:考虑泰勒展开则$x \times (1-x)^{-4}=\sum_{i=0}^n f^i(0) \times \frac {x^i}{i!}$
$n-1$次的系数为 $\frac{f^(n-1)(0)}{(n-1)!}$
$f'=(-4)*(u)^{-5}*(1-x)'=4*(1-x)^{-5}$求导以此类推
即原式为$$\frac {\prod_{i=1}^{n-1} {i+3}} {(n-1)!}=n*(n+1)*(n+2)/6=C_{n+2}^3$$
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<map> 10 #include<set> 11 #define ll long long 12 #define inf 2139062143 13 #define MAXN 100100 14 #define MOD 10007 15 #define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i) 16 #define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i) 17 #define ren(x) for(register int i=fst[x];i;i=nxt[i]) 18 #define pb(i,x) vec[i].push_back(x) 19 #define pls(a,b) (a+b)%MOD 20 #define mns(a,b) (a-b+MOD)%MOD 21 #define mlp(a,b) (1LL*(a)*(b))%MOD 22 using namespace std; 23 inline int read() 24 { 25 int x=0,f=1;char ch=getchar(); 26 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 27 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 28 return x*f; 29 } 30 int n;char ch; 31 int q_pow(int bas,int t,int res=1) 32 { 33 for(;t;bas=mlp(bas,bas),t>>=1) 34 if(t&1) res=mlp(res,bas);return res; 35 } 36 int main() 37 { 38 ch=getchar(); 39 while(isdigit(ch)) {n=(n*10+ch-'0')%MOD;ch=getchar();} 40 printf("%d\n",mlp(mlp(mlp(n,n+1),n+2),q_pow(6,MOD-2))); 41 }