生成函数入门

生成函数 (构造问题)

1.数列→函数

F ( x ) = a 0 + a 1 x + a 2 x 2 + … … + a n x n + … … F(x) = a_0 + a_1x+ a_2x^2 +……+a_nx^n+…… F(x)=a0+a1x+a2x2+……+anxn+……

这样的函数其数列为 {a0 a1 a2 …… an} 为该数列的生成函数

eg: {1,1,1,1,1……}  一组全为1的公式其生成函数
    F(x) = 1 + x + x^2 + x^3 + x^4 + x^5 + x^6 …… 
    1/(1-x) = F(x) = 1 + x + x^2 + x^3 + x^4 + x^5 + x^6 …… 
    
    从 1/(1-x) → 推导
    广义牛顿二项式

在这里插入图片描述

1 ( 1 − x ) → 1 ( 1 − x ) p 1 ( 1 + x ) p = ∑ r = 0 ∞ ( − p r ) x r ( − p r ) = ( − p ) ( − p − 1 ) … … ( − p − r + 1 ) ( r ! ) = ( − 1 ) r ( p ) ( p + 1 ) … … ( p + r − 1 ) ( r ! ) = ( − 1 ) r ( r + 1 ) ( r + 2 ) … … ( p + r − 1 ) ( 1 ∗ 2 ∗ … … ∗ ( p − 1 ) ) = ( − 1 ) r ( p + r − 1 p − 1 ) 1 ( 1 + x ) p = ∑ r = 0 ∞ ( − p r ) x r = ∑ r = 1 ∞ ( − 1 ) r ( p + r − 1 p − 1 ) x r x 换元 − x 1 ( 1 − x ) p = ∑ r = 0 ∞ ( p + r − 1 p − 1 ) x r \frac{1}{(1-x)} → \frac{1}{(1-x)^p} \\ \frac{1}{(1+x)^p} = \sum_{r=0}^{\infty}{-p \choose r}{x^r} \\ {-p \choose r} = \frac{(-p)(-p-1)……(-p-r+1)}{(r!)} =\frac{(-1)^r(p)(p+1)……(p+r-1)}{(r!)} \\ = \frac{(-1)^r(r+1)(r+2)……(p+r-1)}{(1*2*……*(p-1))} \\ = (-1)^r{p+r-1 \choose p-1}\\ \frac{1}{(1+x)^p} = \sum_{r=0}^{\infty}{-p \choose r}{x^r}= \sum_{r=1}^{\infty} (-1)^r{p+r-1 \choose p-1}{x^r}\\ x换元-x\\ \frac{1}{(1-x)^p} = \sum_{r=0}^{\infty}{p+r-1 \choose p-1}{x^r}\\ (1x)1(1x)p1(1+x)p1=r=0(rp)xr(rp)=(r!)(p)(p1)……(pr+1)=(r!)(1)r(p)(p+1)……(p+r1)=(12……(p1))(1)r(r+1)(r+2)……(p+r1)=(1)r(p1p+r1)(1+x)p1=r=0(rp)xr=r=1(1)r(p1p+r1)xrx换元x(1x)p1=r=0(p1p+r1)xr

/*
  斐波那契数列
  F(x) = 0 + x + x^2 + 2x^3 + 3x^4 + 5x^5 + 8x^6 ……
  求F(x)的通式
  其中a = {0,1,1,2,3,5……}  其为斐波那契数列  
  f(0) = 0 , f(1) = 1   f(n) = f(n - 1) + f(n - 2)
  //错位相消 无穷项 
  F(x) =  f(0)x^0 + f(1)x^1 + f(2)x^2 + f(3)x^3 + f(4)x^4 ……
  xF(x) =           f(0)x^1 + f(1)x^2 + f(2)x^3 + f(3)x^4 + f(4)x^5 ……
  x^2F(x) =                   f(0)x^2 + f(1)x^3 + f(2)x^4 + f(3)x^5 + f(4)x^6 ……
  
  F(x) = x / (1 - x - x ^ 2)  
  其x / (1 - x - x ^ 2)  =  {0,1,1,2,3,5,8} 
*/

我们得知斐波那锲求其通项公式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.卷积

F ( x ) = a 0 + a 1 x + a 2 x 2 + … … + a n x n + … … G ( X ) = b 0 + b 1 x + b 2 x 2 + … … + b n x n + … … F ( X ) ∗ G ( X ) = a 0 ∗ b 0 + ( a 1 ∗ b 0 + b 1 ∗ a 0 ) x + ( a 0 ∗ b 2 + a 1 ∗ b 1 + a 2 ∗ b 0 ) x 2 … … F(x) = a_0 + a_1x + a_2x^2 +……+a_nx^n+…… \\ G(X) = b_0 + b_1x + b_2x^2 +……+b_nx^n+…… \\ F(X) * G(X) = a_0*b_0 + (a_1*b_0 + b_1*a_0)x + (a_0*b_2+a_1*b_1+a_2*b_0)x^2 …… F(x)=a0+a1x+a2x2+……+anxn+……G(X)=b0+b1x+b2x2+……+bnxn+……F(X)G(X)=a0b0+(a1b0+b1a0)x+(a0b2+a1b1+a2b0)x2……

1 ( 1 − x ) = 1 + x + x 2 + x 3 + … … F ( x ) ∗ 1 ( 1 − x ) = a 0 + ( a 0 + a 1 ) x + ( a 0 + a 1 + a 2 ) x 2 … … \frac{1}{(1-x)} = 1 + x + x^2+x^3+……\\ F(x) * \frac{1}{(1-x)} = a_0 + (a_0 + a_1)x + (a_0+a_1+a_2)x^2 …… (1x)1=1+x+x2+x3+……F(x)(1x)1=a0+(a0+a1)x+(a0+a1+a2)x2……
卷积后发现每一项都是Sn
1 2 + 2 2 + 3 2 + 4 2 … … F ( x ) = 0 + 1 x + 4 x 2 + 9 x 2 … … 1^2+2^2+3^2+4^2……\\ F(x) = 0 + 1x + 4x^2+9x^2…… 12+22+32+42……F(x)=0+1x+4x2+9x2……

1 ( 1 − x ) = 1 + x + x 2 + x 3 + … … 1 ( 1 − x ) 2 = 1 + 2 x + 3 x 2 + 4 x 3 + … … 1 ( 1 − x ) 3 = 1 + 3 x + 6 x 2 + 10 x 3 + … … x ( 1 − x ) 3 = 0 + 1 x + 3 x 2 + 6 x 3 + 10 x 4 + … … 1 + x ( 1 − x ) 3 = 1 + 4 x + 9 x 2 + 16 x 3 + 25 x 4 + … … x ( 1 + x ) ( 1 − x ) 4 = 0 + 1 x + 5 x 2 + 14 x 3 + 30 x 4 + 55 x 5 + … … = x ( 1 − x ) 4 + ( x 2 ) ( 1 − x ) 4 = ∑ r = 0 ∞ ( 2 + r 3 ) x r + ∑ r = 0 ∞ ( 1 + r 3 ) x r = ∑ r = 0 ∞ n ( n + 1 ) ( 2 n + 1 ) 6 x r \frac{1}{(1-x)} = 1 + x + x^2+x^3+……\\ \frac{1}{(1-x)^2} = 1 + 2x + 3x^2 + 4x^3+……\\ \frac{1}{(1-x)^3} = 1 + 3x + 6x^2 + 10x^3+……\\ \frac{x}{(1-x)^3} = 0 + 1x + 3x^2 + 6x^3 + 10x^4 +……\\ \frac{1+x}{(1-x)^3} = 1 + 4x + 9x^2 + 16x^3 + 25x^4 +……\\ \frac{x(1+x)}{(1-x)^4} = 0 + 1x + 5x^2 + 14x^3 + 30x^4 + 55x^5 +……=\frac{x}{(1-x)^4}+\frac{(x^2)}{(1-x)^4}\\ = \sum_{r=0}^{\infty}{2+r \choose 3}{x^r} + \sum_{r=0}^{\infty}{1+r \choose 3}{x^r} =\sum_{r=0}^{\infty}\frac{n(n+1)(2n+1)}{6}{x^r} (1x)1=1+x+x2+x3+……(1x)21=1+2x+3x2+4x3+……(1x)31=1+3x+6x2+10x3+……(1x)3x=0+1x+3x2+6x3+10x4+……(1x)31+x=1+4x+9x2+16x3+25x4+……(1x)4x(1+x)=0+1x+5x2+14x3+30x4+55x5+……=(1x)4x+(1x)4(x2)=r=0(32+r)xr+r=0(31+r)xr=r=06n(n+1)(2n+1)xr

3 例题

J-一道计数题_文远知行杯广东工业大学第十六届程序设计竞赛 (nowcoder.com)

在这里插入图片描述

eg 3 5 n = 3 m = 5
A : 1 2 1
B :1 2 1 2 2 1 1 3 1 1 2 2 1 + 2 + 3 + 2 = 8

1.b(i) >= a(i)

想法: 这里我们列举所有可能情况然后进行卷积构造
在这里插入图片描述

k我们代表 0 ,1, 2,3…… m
累加的i和组合数的i还有xi有关,累积的i和组合数ai有关
f(x) = b0x0+ b1x1 + b2 x2 + ……+ bk xk
这时候这个构造函数我们只需要将b0 + b1 + b2 + b3 + b4 +……+ bk的和
上满那个例子
b0 = 0 b1 = 0 b2 = 0 b3 = 0 b4 = 1 b5 = 2 + 2 + 3 = 7

现在我们需要求对应的b0 b1 b2 b3 b4 b5
对A中的ai进行牛顿二项式构造 m代表正无穷
C(i , a0) f(x) = C(0,a0) x0 + C(1,a0) x1 + C(2,a0) x2 + …… +C(n,a0)xm
C(i , a1) f(x) = C(0,a1) x0 + C(1,a1) x1 + C(2,a1) x2 + …… +C(n,a1)xm
C(i , a2) f(x) = C(0,a2) x0 + C(1,a2) x1 + C(2,a2) x2 + …… +C(n,a2)xm
……
C(i , an) f(x) = C(0,an) x0 + C(1,an) x1 + C(2,an) x2 + …… +C(n,an)xm
这里用卷积可以求出对应 x0 x1 x2 x3 x4 …… xk

对于该例子: (C(0,a0) * C(0,a1) * C(0,a2)) x^0 + (C(1,a0) * C(0,a1) * C(0,a2) + C(0,a0) * C(1,a1) * C(0,a2) + C(0,a0) * C(0,a1) * C(1,a2) ) x^1 + () x^2 同理 因为前面都为0所以我们直接来写x^5的情况

a0 = 1 a1 = 2 a2 = 1

5 0 0 0 5 0 0 0 5 4 1 0 4 0 1 0 4 1 1 4 0 1 0 4 0 1 4 3 2 0 3 0 2 0 3 2 2 3 0 2 0 3 0 2 3
…… 其实写了这些你会发现基本都为0 所以我们写出几个不为0的情况 2 2 1 1 3 1 1 2 2 其余情况均为0

(C(2,a0) * C(2,a1) * C(1,a2) + C(1,a0) + C(3,a1) + C(1,a2) + C(1,a0) * C(2,a1) * C(2,a2)) x5
里面为7

所以我们便可以生成一个构造函数(说白了k就是在后面生成的构造函数中截取了一段)
在这里插入图片描述

x t ( 1 − x ) n + t = x t ∑ k = 0 ∞ ( k + n + t − 1 n + t − 1 ) x k = ∑ k = 0 ∞ ( k + n + t − 1 n + t − 1 ) x k + t = ∑ k = 0 ∞ ( k + n − 1 n + t − 1 ) x k \frac{x^t}{(1-x)^{n+t}} = x^t \sum_{k=0}^{\infty}{k+n+t-1 \choose n+t-1}{x^k}\\ = \sum_{k=0}^{\infty}{k+n+t-1 \choose n+t-1}{x^{k+t}} = \sum_{k=0}^{\infty}{k+n-1 \choose n+t-1}{x^k} (1x)n+txt=xtk=0(n+t1k+n+t1)xk=k=0(n+t1k+n+t1)xk+t=k=0(n+t1k+n1)xk
在这里插入图片描述

( n k ) = ( n − 1 k − 1 ) + ( n − 1 k ) ∑ l = 0 n ( l k ) = ( 0 k ) + ( 1 k ) + … … + ( k k ) + … … + ( n k ) ( n + 1 k + 1 ) = ( n k ) + ( n k + 1 ) = ( n k ) + ( n − 1 k ) + ( n − 1 k + 1 ) = ( n k ) + ( n − 1 k ) + ( n − 2 k ) + ( n − 3 k ) + … … + ( 0 k ) + ( 0 k + 1 ) {n\choose k} = {n-1 \choose k - 1} + {n - 1 \choose k}\\\sum_{l=0}^{n}{l \choose k} = {0 \choose k} + {1 \choose k} +……+{k \choose k}+……+{n \choose k}\\{n+1 \choose k+1} = {n \choose k} + {n \choose k+1} = {n \choose k} + {n-1 \choose k} +{n -1 \choose k + 1}\\= {n \choose k} + {n-1\choose k} + {n - 2 \choose k} + {n -3 \choose k}+……+{0 \choose k} + {0 \choose k+1} (kn)=(k1n1)+(kn1)l=0n(kl)=(k0)+(k1)+……+(kk)+……+(kn)(k+1n+1)=(kn)+(k+1n)=(kn)+(kn1)+(k+1n1)=(kn)+(kn1)+(kn2)+(kn3)+……+(k0)+(k+10)

m = 5 n = 3 t = 1+2+1 = 4 C(8,7) = 8

#include<bits/stdc++.h>

using namespace std;

const int MOD = 1e9 + 7;

int mpow(int x , int y = MOD - 2) {
    int ret = 1;
    while (y) {
        if (y & 1) ret = 1ll * ret * x % MOD;
        x = 1ll * x * x % MOD;
        y >>= 1;
    }
    return ret;
}

int main() {
    cin.tie(nullptr)->sync_with_stdio(0);

    int N , m;
    cin >> N >> m;

    int u = m + N;

    int sum = 0;
    for (int i = 1 ; i <= N ; i++) {
        int x;
        cin >> x;
        sum += x;
        if (sum >= MOD) sum -= MOD;
    }

    if (m + N < N + sum) {
        cout << "0\n";
    } else {
        int ans = 1 , d = 1;
        for (int i = 1 ; i <= N + sum ; i++) {
            ans = 1ll * ans * (u - i + 1) % MOD;
            d = 1ll * d * i % MOD;
        }
        d = mpow(d);
        cout << 1ll * ans * d % MOD << endl;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值