第八章 生成函数1

第八章 生成函数(数学)

8.1 笔记

  • 形式幂级数 A ( x ) = ∑ i ≥ 0 a i x i A(x)=\sum\limits_{i\ge 0}a_ix^i A(x)=i0aixi

    多项式 A ′ ( x ) = ∑ i ≥ 0 n a i x i A'(x)=\sum\limits_{i\ge 0}^na_ix^i A(x)=i0naixi

    • 运算:设 A ( x ) = ∑ i ≥ 0 a i x i , B ( x ) = ∑ i ≥ 0 b i x i A(x)=\sum\limits_{i\ge 0}a_ix^i,B(x)=\sum\limits_{i\ge 0}b_ix^i A(x)=i0aixi,B(x)=i0bixi

      • 加减法: A ( x ) ± B ( x ) = ∑ i ≥ 0 ( a i ± b i ) x i A(x)\pm B(x) = \sum\limits_{i\ge 0}(a_i\pm b_i)x^i A(x)±B(x)=i0(ai±bi)xi
      • 乘法: A ( x ) B ( x ) = ∑ k ≥ 0 ( ∑ i = 0 k a i b k − i ) x k A(x)B(x)=\sum\limits_{k\ge 0}\left(\sum\limits_{i=0}^ka_ib_{k-i} \right)x^k A(x)B(x)=k0(i=0kaibki)xk

      形式幂级数在定义的 + , − , × +,-,\times +,,× 下形成环

    • A ( x ) A(x) A(x) x n x^n xn 项的系数为 [ x n ] A ( x ) [x^n]A(x) [xn]A(x)

  • 常生成函数 Oridinary:一个数列 { a n } \{a_n\} {an} 对应的常生成函数为 A ( x ) = ∑ n ≥ 0 a n x n A(x)=\sum\limits_{n\ge 0} a_nx^n A(x)=n0anxn

    • 不定方程的解的数量:求不定方程 x 1 + x 2 + . . . + x k = n x_1+x_2+...+x_k=n x1+x2+...+xk=n 的解的数量,其中 x i ∈ Z , l i ≤ x i ≤ r i ( 1 ≤ i ≤ k ) x_i\in Z,l_i\le x_i\le r_i(1\le i\le k) xiZ,lixiri(1ik)

      :设 F i ( x ) = ∑ j = l i r i x j F_i(x)=\sum\limits_{j=l_i}^{r_i}x_j Fi(x)=j=lirixj,则 F ( x ) = ∏ i = 1 k F i ( x ) F(x)=\prod\limits_{i=1}^{k} F_i(x) F(x)=i=1kFi(x),故 a n s = [ x n ] F ( x ) ans=[x^n]F(x) ans=[xn]F(x)

      例题 \color{White}\colorbox{Fuchsia}{例题} :求 x 1 + 2 x 2 + 3 x 3 = 100 x_1+2x_2+3x_3=100 x1+2x2+3x3=100 的正整数解的个数

      解:设 F 1 = ∑ i ≥ 1 x i F_1=\sum\limits_{i\ge 1}x^i F1=i1xi F 2 = ∑ i ≥ 1 , 2 ∣ i x i F_2=\sum\limits_{i\ge 1,2\mid i}x^i F2=i1,2ixi F 3 = ∑ i ≥ 1 , 3 ∣ i x i F_3=\sum\limits_{i\ge 1,3\mid i}x^i F3=i1,3ixi

      于是答案为 [ x 100 ] F ( x ) = [ x 100 ] F 1 ( x ) F 2 ( x ) F 3 ( x ) [x^{100}]F(x)=[x^{100}]F_1(x)F_2(x)F_3(x) [x100]F(x)=[x100]F1(x)F2(x)F3(x)

  • 形式幂级数的逆元 A ( x ) B ( x ) = 1 A(x)B(x)=1 A(x)B(x)=1

    • 存在条件: [ x 0 ] A ( x ) ≠ 0 [x^0]A(x)\ne 0 [x0]A(x)=0

    • 暴力计算:递推

    • 常见逆元

      1. 1 + x + x 2 + . . . = 1 1 − x 1+x+x^2+...=\dfrac{1}{1-x} 1+x+x2+...=1x1

      2. 1 + a x + a 2 x 2 + . . . = 1 1 − a x 1+ax+a^2x^2+...=\dfrac{1}{1-ax} 1+ax+a2x2+...=1ax1

      3. C k − 1 0 + C k 1 x + C k + 1 2 x 2 + C k + 2 3 x 3 + . . . = ∑ i ≥ 0 C i + k − 1 i x i = ∑ i ≥ 0 C i + k − 1 k − 1 x i = 1 ( 1 − x ) k C_{k-1}^0+C_k^1x+C_{k+1}^2x^2+C_{k+2}^3x^3+...= \sum\limits_{i\ge 0}C_{i+k-1}^ix^i= \sum\limits_{i\ge 0}C_{i+k-1}^{k-1}x^i =\dfrac{1}{(1-x)^k} Ck10+Ck1x+Ck+12x2+Ck+23x3+...=i0Ci+k1ixi=i0Ci+k1k1xi=(1x)k1

        于是 [ x i ] 1 ( 1 − x ) k = C k + i − 1 i \color{red}[x^i]\dfrac{1}{(1-x)^k}=C_{k+i-1}^{i} [xi](1x)k1=Ck+i1i

      4. 1 + f ( x ) + f 2 ( x ) + f 3 ( x ) + . . . = 1 1 − f ( x ) 1+f(x)+f^2(x)+f^3(x)+...=\dfrac{1}{1-f(x)} 1+f(x)+f2(x)+f3(x)+...=1f(x)1

  • 卢卡斯定理(Lucas):对于素数 p p p​,有
    C n m % p = C n / p m / p ⋅ C n % p n % p    % p C_n^m\%p=C_{n/p}^{m/p}\cdot C_{n\%p}^{n\%p}\;\%p Cnm%p=Cn/pm/pCn%pn%p%p

    • n , m n,m n,m 较大时适用
    • 对于 n % p , m % p n\%p,m\%p n%p,m%p 可直接求解
ll inv(ll i){
    if(i == 1) return 1;
    return (mod - mod / i) * inv(mod % i) % mod;
}
ll C(ll n, ll m){
    m = min(m, n - m);
    if(m == 0) return 1;
    return C(n - 1, m - 1) * n % mod * inv(m) % mod;
}
ll Lucas(ll n, ll m){
    if (m == 0) return 1;
    return (C(n % mod, m % mod) * Lucas(n / mod, m / mod) + mod) % mod;
}

8.2 习题

第八章习题链接

A. 背包

  • 思路:八种物品,每种有一个生成函数,
    F 1 ( x ) = 1 + x = 1 − x 2 1 − x F 2 ( x ) = 1 + x + x 2 = 1 − x 3 1 − x F 3 ( x ) = 1 + x + x 2 + x 3 = 1 − x 4 1 − x F 4 ( x ) = 1 + x 2 + x 4 + x 6 + . . . = 1 1 − x 2 F 5 ( x ) = x + x 3 + x 5 + x 7 + . . . = x 1 − x 2 F 6 ( x ) = 1 + x 4 + x 8 + x 12 + . . . = 1 1 − x 4 F 7 ( x ) = 1 + x = 1 − x 2 1 − x F 8 ( x ) = 1 + x 3 + x 6 + x 9 + . . . = 1 1 − x 3 ∴ F ( x ) = ∏ i = 1 8 F i ( x ) = x ( 1 − x ) 4 = x ∑ i ≥ 0 C i + 3 i x i = ∑ i ≥ 0 C i + 3 3 x i + 1 = ∑ i ≥ 1 C i + 2 3 x i \begin{aligned} F_1(x)&=1+x=\dfrac{1-x^2}{1-x} \\ F_2(x)&=1+x+x^2=\dfrac{1-x^3}{1-x} \\ F_3(x)&=1+x+x^2+x^3=\dfrac{1-x^4}{1-x} \\ F_4(x)&=1+x^2+x^4+x^6+...=\dfrac{1}{1-x^2} \\ F_5(x)&=x+x^3+x^5+x^7+...=\dfrac{x}{1-x^2} \\ F_6(x)&=1+x^4+x^8+x^{12}+...=\dfrac{1}{1-x^4} \\ F_7(x)&=1+x=\dfrac{1-x^2}{1-x} \\ F_8(x)&=1+x^3+x^6+x^9+...=\dfrac{1}{1-x^3} \\ \therefore F(x)&=\prod\limits_{i=1}^8F_i(x)=\dfrac{x}{(1-x)^4}=x\sum\limits_{i\ge 0} C_{i+3}^ix^i=\sum\limits_{i\ge 0} C_{i+3}^3x^{i+1}=\sum\limits_{i\ge 1} C_{i+2}^3x^{i} \end{aligned} F1(x)F2(x)F3(x)F4(x)F5(x)F6(x)F7(x)F8(x)F(x)=1+x=1x1x2=1+x+x2=1x1x3=1+x+x2+x3=1x1x4=1+x2+x4+x6+...=1x21=x+x3+x5+x7+...=1x2x=1+x4+x8+x12+...=1x41=1+x=1x1x2=1+x3+x6+x9+...=1x31=i=18Fi(x)=(1x)4x=xi0Ci+3ixi=i0Ci+33xi+1=i1Ci+23xi

    于是 [ x n ] F ( x ) = C n + 2 3 [x^n]F(x)=C_{n+2}^3 [xn]F(x)=Cn+23

#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long
#define db double
#define VI vector<int>
#define PII pair<int, int>
const db Pi = 3.141592653589793;
const int INF = 0x7fffffff;
const int N = 1e5 + 5;
const db eps = 1e-10;
const int mod = 1e9 + 7;
ll n;
ll inv(ll i){
    if(i == 1) return 1;
    return (mod - mod / i) * inv(mod % i) % mod;
}
int main(){
    cin >> n;
    n %= mod;
    cout << (n * (n + 1) % mod * (n + 2) % mod * inv(6) % mod) << endl;
}
/*
5
*/

B. Devu and Flowers

  • 来源:CF451 E

  • 题目 n n n 种花,每种分别有 f 1 , f 2 , . . . , f n f_1,f_2,...,f_n f1,f2,...,fn 朵,求取 s s s 朵花的方案数。( 1 ≤ n ≤ 20 , 0 ≤ f i ≤ 1 0 12 , 0 ≤ s ≤ 1 0 14 1\le n\le 20,0\le f_i\le 10^{12},0\le s\le 10^{14} 1n20,0fi1012,0s1014

  • 思路

    • F i ( x ) = 1 + x + x 2 + . . . + x f i ( x ) = 1 − x f i ( x ) + 1 1 − x F_i(x)=1+x+x^2+...+x^{f_i(x)}=\dfrac{1-x^{f_i(x) +1}}{1-x} Fi(x)=1+x+x2+...+xfi(x)=1x1xfi(x)+1

    • F ( x ) = ∏ i = 1 n F i ( x ) = ∏ i = 1 n ( 1 − x f i ( x ) + 1 ) ( 1 − x ) n F(x)=\prod\limits_{i=1}^{n}F_i(x)=\dfrac{\prod\limits_{i=1}^{n}(1-x^{f_i(x)+1})}{(1-x)^n} F(x)=i=1nFi(x)=(1x)ni=1n(1xfi(x)+1)

    • A ( x ) = ∏ i = 1 n ( 1 − x f i ( x ) + 1 ) A(x)=\prod\limits_{i=1}^{n}\left(1-x^{f_i(x)+1}\right) A(x)=i=1n(1xfi(x)+1),故
      [ x s ] F ( x ) = ∑ i = 1 n [ x i ] A ( x ) ⋅ [ x s − i ] 1 ( 1 − x ) n = ∑ i = 1 n [ x i ] A ( x ) ⋅ C s − i + n − 1 n − 1 {\color{red}[x^s]F(x)}=\sum\limits_{i=1}^n [x^i] A(x)\cdot [x^{s-i}]\dfrac{1}{(1-x)^n}={\color{red}\sum\limits_{i=1}^n [x^i] A(x)\cdot C_{s-i+n-1}^{n-1}} [xs]F(x)=i=1n[xi]A(x)[xsi](1x)n1=i=1n[xi]A(x)Csi+n1n1

    • 由于 n n n 较小,故可用二进制来求出 [ x i ] A ( x ) [x^i]A(x) [xi]A(x)

#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long
#define db double
#define VI vector<int>
#define PII pair<int, int>
const db Pi = 3.141592653589793;
const int INF = 0x7fffffff;
const int N = 2e1 + 5;
const db eps = 1e-10;
const int mod = 1e9 + 7;
ll n, s, f[N], ans = 0;
ll inv(ll i){
    if(i == 1) return 1;
    return (mod - mod / i) * inv(mod % i) % mod;
}
ll C(ll n, ll m){
    m = min(m, n - m);
    if(m == 0) return 1;
    return C(n - 1, m - 1) * n % mod * inv(m) % mod;
}
ll Lucas(ll n, ll m){
    if (m == 0) return 1;
    return (C(n % mod, m % mod) * Lucas(n / mod, m / mod) + mod) % mod;
}
int main(){
    cin >> n >> s;
    rep(i, 1, n) cin >> f[i];
    rep(t, 0, (1 << n) - 1){
        ll sign = 1, cnt = 0;
        rep(i, 1, n){
            if(t & (1 << (i - 1))){
                cnt += f[i] + 1;
                sign = -sign;
            }
        }
        if(cnt > s) continue;
        ans += sign * Lucas(s + n - 1 - cnt, n - 1) % mod;
        ans %= mod;
    }
    cout << (ans + mod) % mod << endl;
}
/*
2 3
1 3  

2 4
2 2

3 5
1 3 2
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值