Generating Function

Wiki:Generating_function 

Easy:TankyWoo matrix67

Essay:《母函数的性质及应用》 

Difficult:《Concrete Mathematics》7.Generating Function


Common Types:

G(x)=1/(1-x)=1+x+x^2+x^3+...

G(x)=1/(1-x)^2=G'(x)=1+2*x+3*x^2+...

G(x)=1/(1-x)^n=(1+x+x^2+x^3+...)^n=1+C(n,n-1)*x+C(n+1,n-1)*x^2+...+C(n+k-1,n-1)*x^k+...

G(x)=e^x=1+x+x^2/2!+x^3/3!+...     <1,1,1,1,1,1,...>

G(x)=e^(-x)=1-x+x^2/2!-x^3/3!+...  <1,-1,1,-1,1,...>

G(x)=(e^x+e^(-x))/2    <1,0,1,0,1,....>

G(x)=(e^x-e^(-x))/2    <0,1,0,1,0,....>


Practice: 

Easy: 

hdu1028.cpp  hdu1085.cpp  hdu1171.cpp  hdu1398.cpp 

hdu1521.cpp  hdu1709.cpp  hdu2065.cpp  hdu2069.cpp 

hdu2079.cpp  hdu2082.cpp  hdu2110.cpp  hdu2152.cpp 

hdu2189.cpp  poj3734.cpp 


Normal: 

Poj1322 Chocolate 

题意:C(<=100)种巧克力,依次拿出n个,当某种巧克力的个数为2时,拿走这2个,求剩下恰好m个巧克力的概率(0<=n,m<=10^6)

思路:无解的情况当然是m>n或m>c或(n-m)&1.

对于C种巧克力出现的次数要么为奇数,要么为偶数.

g1(x)=e^x=1+x/1!+x^2/2!+x^3/3!+...

g2(x)=e^-x=1-x/1!+x^2/2!-x^3/3!+...

那么奇数次的生成函数为f1(x)=(e^x+e^-x)/2,偶数次的生成函数为f2(x)=(e^x-e^-x)/2 

so G(x)=f1(x)^m*f2(x)^(c-m)=(e^x+e^-x)^m*(e^x-e^-x)^(c-m)/2^c 

化简得 令分别取s,t 得某项 (-1)^s*C(m,s)*C(c-m,t)*e^(x*(c-2*s-2*t)) 

用泰勒展开式可知 x^n 的系数 g(n)=sigma((-1)^s*C(m,s)*C(c-m,t)*(c-2*s-2*t)^n) (0<=s<=m,0<=t<=c-m) 

so ans=C(c,m)*g(n)/c^n (p.s.计算的时候把c^n的计算带到循环里,不然前面计算太大溢出答案会输出1.#IO)

Code:poj1322.cpp 


CEOI2004 Sweet

题意:n个糖果罐里分别有mi颗糖,问至少吃a颗,至多吃b颗的方案数%2004

思路:对每个糖果罐L(i)(x)=(1+x+x^2+..+x^m[i])  so 生成函数为

G(x)=(1+x+x^2+...+x^m[1])*(1+x+x^2+...+x^m[2])*...*(1+x+x^2+...+x^m[n])

=(1-x^(m[1]+1))/(1-x)*...*(1-x^(m[1]+1))/(1-x)

=(1-x^(m[1]+1))*...*(1-x^(m[n]+1))*1/(1-x)^n

求的是一个区间值,那么我们令 Candy(x) 表示至多吃的糖数的前x项和

左边用最暴力的方法可以得到一个至多为2^n项的式子,表示成F(x),第k项为 f(k)*x^k

右边(1-x)^n展开得到 H(x)=1+C(n,n-1)*x+C(n+1,n-1)*x^2+...,第k项为 h(x)*x^k

假设吃了I颗,那么它的系数为 g[I]=sigma(f(i)*h(I-i)) (i∈set,不一定是连续的)

对于前I项和,Candy(I)=sigma(f[i]*(1+C(n,n-1)+C(n+1,n-1)+...+C(n+I-i-1,n-1))) (i∈set)

化简多项式的结果,Candy(I)=sigma(f[i]*C(n+I-i,n)) (i∈set)

ans=Candy(B)-Candy(A-1)

Code:CEOI2004sweet.cpp 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值