好久没写博客了,有好多都是写成了草稿没写完。列个清单慢慢补。。
好了进入正题=============================================
数据结构老师让搜 ( 7 0.5 ) \binom{7}{0.5} (0.57) 这种东西。搜出来是广义组合数,对应的有广义二项式定理。一看这个玩意儿ACM经常用就学一下。
本来C(n, m)的定义是 ( m n ) = n ! m ! ( n − m ) ! \binom{m}{n}=\frac{n!}{m!(n-m)!} (nm)=m!(n−m)!n! ,但是m>n的时候就会出现n-m<0的情况,而负数没有阶乘,所以好像因为这玩意儿还把定义给改了,改成 ( m n ) = ∏ i = n − m + 1 n i m ! \binom{m}{n}=\frac{\prod_{i=n-m+1}^{n} {i}}{m!} (nm)=m!∏i=n−m+1ni
这样以后就能兼容表示了,和n、m的大小没关系。
比如
( 5 4 ) = 0 ∗ 1 ∗ 2 ∗ 3 ∗ 4 5 ! = 0 \binom{5}{4}=\frac{0 * 1 * 2 * 3 * 4}{ 5!} = 0 (45)=5!0∗1∗2∗3∗4=0
( 2 − 2 ) = ( − 3 ) ∗ ( − 2 ) 2 ! = − 3 \binom{2}{-2}=\frac{(-3)*(-2)}{2!} =-3 (−22)=2!(−3)∗(−2)=−3
( 1 0.5 ) = 0.5 1 = 0.5 \binom{1}{0.5}=\frac{0.5}{1}=0.5 (0.51)=10.5=0.5
至于这个玩意儿有没有什么现实意义emmm大概就像虚数一样吧,莫强求。
对了,显然,m在这儿要是非负整数,因为要算阶乘。
这个东西概率论老师提到过,求积分(伽马分布)的时候好用。
这个函数是欧拉搞出来的,本来是哥德巴赫想搞,没搞出来,然后他写信问伯努利(我也不知道是那一家子里的哪一个),那时候欧拉刚好在伯努利旁边顺手就搞出来了。然而那时候欧拉才22岁。
其实这个就是把阶乘扩展到实数域了。用 Γ ( x ) \Gamma(x) Γ(x)表示阶乘的话,整数的时候有 Γ ( x ) = ( x − 1 ) Γ ( x − 1 ) \Gamma(x)=(x-1)\Gamma(x-1) Γ(x)=(x−1)Γ(x−1)。把这个定义拓展到实数域同样适用。这个函数的积分写法是 Γ ( n ) = ∫ 0 + ∞ x n − 1 e − x d x \Gamma(n)=\int_{0 }^{+\infty}{x^{n-1}e^{-x}dx} Γ(n)=∫0+∞xn−1e−xdx
对右边积分化简,得
Γ ( n ) = ∫ 0 + ∞ x n − 1 e − x d x = − x n − 1 e − x ∣ 0 + ∞ + ( n − 1 ) ∫ 0 + ∞ x n − 1 e − x d x = 0 + ( n − 1 ) ∫ 0 + ∞ x n − 1 e − x d x = ( n − 1 ) Γ ( n − 1 ) \begin{aligned} \Gamma(n)&=\int_{0 }^{+\infty}{x^{n-1}e^{-x}dx} \\ &=-x^{n-1}e^{-x}|_{0}^{+\infty}+(n-1)\int_{0 }^{+\infty}{x^{n-1}e^{-x}dx} \\ &=0+(n-1)\int_{0 }^{+\infty}{x^{n-1}e^{-x}dx} \\ &=(n-1)\Gamma(n-1) \end{aligned} Γ(n)=∫0+∞xn−1e−xdx=−xn−1e−x∣0+∞+(n−1)∫0+∞xn−1e−xdx=0+(n−1)∫0+∞xn−1e−xdx=(n−1)Γ(n−1)
有了这个定义可以写小数阶乘。这个和广义组合数有点关系其实(在正数部分),具体的就不说了没什么用。
原来的二项式定理中n是正数,广义的二项式定理中定义了负数的范围。
( 1 − x ) − n = ∑ i = 0 + ∞ ( i − n ) ( − x ) i = ∑ i = 0 + ∞ ( i n + i − 1 ) x i = ∑ i = 0 + ∞ ( n − 1 n + i − 1 ) x i ( − 1 ≤ x ≤ 1 ) (1-x)^{-n}=\sum_{i=0}^{+\infty}\binom{i}{-n}(-x)^{i}=\sum_{i=0}^{+\infty}\binom{i}{n+i-1}x^{i} =\sum_{i=0}^{+\infty}\binom{n-1}{n+i-1}x^{i} \\(-1\leq x \leq 1) (1−x)−n=i=0∑+∞(−ni)(−x)i=i=0∑+∞(n+i−1i)xi=i=0∑+∞(n+i−1n−1)xi(−1≤x≤1)
这里面的组合数是广义的。
这个定理用泰勒展开很好证明,就不写了。
母函数是ACM里经常用到的处理组合数学的工具,今天学了一下。
母函数分为很多种, 分为普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数,每种母函数对应不同种类的序列。今天先写普通的母函数,以后遇到再补。
我学了一点,觉得普通母函数是把序列信息存在指数或者系数位置,然后利用构造出的母函数来解决问题。
母函数就是一列用来展示一串数字的挂衣架。——赫伯特·唯尔夫
这个挂衣架是什么意思呢,举几个栗子来看一下:
对于序列1,2,3,4,5可以(还有其他)构造出母函数: g ( x ) = x 1 + 2 x 2 + 3 x 3 + 4 x 4 + 5 x 5 g(x)=x^{1}+2x^{2}+3x^{3}+4x^{4}+5x^{5} g(x)=x1+2x2+3x3+4x4+5x5
对于序列5,5,5,5,5可以(还有其他)构造出母函数: g ( x ) = 5 x 1 + 5 x 2 + 5 x 3 + 5 x 4 + 5 x 5 g(x)=5x^{1}+5x^{2}+5x^{3}+5x^{4}+5x^{5} g(x)=5x1+5x2+5x3+5x4+5x5
这么看来普通母函数的定义就很明显了:
对 于 序 列 a 1 . . . a n : g ( x ) = ∑ i = 1 n a i x i 对于序列a_{1}...a_{n}:g(x)=\sum_{i=1}^{n}a_{i}x^{i} 对于序列a1...an:g(x)=i=1∑naixi
母函数有什么应用呢?先看一道题目:
n+k= x 1 + x 2 + . . . x k x_{1}+x_{2}+...x_{k} x1+x2+...xk的正整数解有多少种?
中学的想法是“隔板法”,也就是在n+k个东西中间插上k-1个板子,那分成的k个区域就是一种解。总共有 ( k − 1 n + k − 1 ) = ( n n + k − 1 ) \binom{k-1}{n+k-1}=\binom{n}{n+k-1} (n+k−1k−1)=(n+k−1n)种。其实这个问题可以用母函数来解决。
显然每个变量 x i x_{i} xi解的范围是序列[0, n],所以对于某个变量来说每个小于n正整数都可能取到,也就是每个数字可能取一个,这个个数序列就是[1, 1, 1, 1, …1],一共n+1个1表示数字0~n可能取一次, 所以每个变量的可以构造母函数 g ( x ) = ∑ i = 0 + ∞ x i = ( 1 − x ) − 1 g(x)=\sum_{i=0}^{+\infty}x^{i}=(1-x)^{-1} g(x)=∑i=0+∞xi=(1−x)−1。我们把每个变量的母函数乘起来,得到最终的母函数
G ( x ) = ( g ( x ) ) k = ( 1 − x ) − k G(x)=(g(x))^{k}=(1-x)^{-k} G(x)=(g(x))k=(1−x)−k
可以知道这个G(x)展开式中 x n x^{n} xn的系数就是答案。为什么呢?因为序列的信息放在指数和系数上了(指数部分表示取这个值,系数部分表示取一次),当各个母函数相乘的时候指数部分就相加,所以最终每有一个指数为n的项就是一个解,所以 x n x^{n} xn的系数就是答案。
那母函数的系数怎么求呢,那就要用到广义二项式定理了。根据上面的定理, x n x^{n} xn的项就是 ( n n + k − 1 ) \binom{n}{n+k-1} (n+k−1n),和隔板法得到的结果一致。
再来一道题:BZOJ3028 食物
题意是每种食物的限制如下:
汉堡:偶数个;
可乐:0个或1个
鸡腿:0个,1个或2个
蜜桃:奇数个
鸡块:4的倍数个
包子:0个,1个,2个或3个
土豆:不超过一个。
面包:3的倍数个
问带n个食物的方案数(n<=10^500)
对每种食物构造母函数:
汉堡= x 0 + x 2 + x 4 . . . = 1 1 − x 2 x^{0}+x^{2}+x^{4}...=\frac{1}{1-x^{2}} x0+x2+x4...=1−x21
可乐= x 0 + x 1 = 1 + x x^{0}+x^{1}=1+x x0+x1=1+x
鸡腿= x 0 + x 1 + x 2 x^{0}+x^{1}+x^{2} x0+x1+x2
蜜桃= x 1 + x 3 + x 5 . . . = x 1 − x 2 x^{1}+x^{3}+x^{5}...=\frac{x}{1-x^2} x1+x3+x5...=1−x2x
鸡块= x 0 + x 4 + x 8 . . . = 1 1 − x 4 x^{0}+x^{4}+x^{8}...=\frac{1}{1-x^{4}} x0+x4+x8...=1−x41
…
最终得到 x ( 1 − x ) 4 \frac{x}{(1-x)^{4}} (1−x)4x
因为 1 1 − x \frac{1}{1-x} 1−x1是等比级数,所以 1 ( 1 − x ) 4 \frac{1}{(1-x)^{4}} (1−x)41可以看成 ( 1 − x ) − 4 (1-x)^{-4} (1−x)−4,就可以得到 ( 1 − x ) − 4 (1-x)^{-4} (1−x)−4的 x n − 1 x^{n-1} xn−1的系数 ( 4 − 1 4 + n − 1 − 1 ) = ( 3 n + 2 ) \binom{4 -1}{4 + n - 1-1}=\binom{3}{n+2} (4+n−1−14−1)=(n+23)。
所以答案是 ( 3 n + 2 ) \binom{3}{n+2} (n+23)。
bzoj3028
就是上面的例题
HDU1028
HDU1085
洛谷P2000
Bzoj3771 (母函数 FFT 容斥)
bzoj3509 (母函数+分块+暴力+FFT)
关于FFT看我写的这个多项式变换与FFT
bzoj3696 (异或规则下的母函数)
hdu1557
hdu1028 任意给你一个整数,问有多少种拆分方案。
hdu1398
hdu 1171
hdu 2079
hdu2082
hdu 1521 (指数型母函数)