2024.9.18

生成函数1

生成函数(generating function),又称母函数,是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。

其用来计算组合数中诸如选择某一数量方案数的一种强有力的工具

加法生成函数

也算常生成函数啦

对于一个生成函数,将其定义为形式幂级数

定义一个数列 { a i } \{a_i\} {ai}的生成函数为 ∑ i ≥ 0 a i x i \sum_{i\ge 0}a_ix_i i0aixi

形式幂级数

A ( x ) = ∑ i ≥ 0 a i x i     B ( t ) = ∑ i ≥ 0 b i x i A(x) =\sum_{i\ge 0}a_ix^i \ \ \ B(t)=\sum_{i\ge 0}b_ix^i A(x)=i0aixi   B(t)=i0bixi

加法: A ( t ) + B ( t ) = ∑ i ≥ 0 ( a i + b i ) x i A(t)+B(t) = \sum_{i\ge 0}(a_i+b_i)x^i A(t)+B(t)=i0(ai+bi)xi

减法: A ( x ) − B ( x ) = ∑ i ≥ 0 ( a i − b i ) x i A(x)-B(x)=\sum_{i\ge 0}(a_i-b_i)x^i A(x)B(x)=i0(aibi)xi

乘法: A ( x ) B ( x ) = ∑ k ≥ 0 ( ∑ i + j = k a i b j ) x k A(x)B(x) = \sum_{k\ge 0}(\sum_{i+j=k}a_ib_j) x^k A(x)B(x)=k0(i+j=kaibj)xk

可以验证,形式幂级数在以上定义的 + , − , × +,-,\times +,,×下形成一个环

记号:记形式幂级数(或多项式) A ( x ) A(x) A(x) x n x^n xn 项的系数为 [ x n ] A ( x ) [x^n]A(x) [xn]A(x)

多项式与形式幂级数

多项式: A ( x ) = ∑ i = 0 n a i x i A(x)=\sum^n_{i=0}a_ix^i A(x)=i=0naixi

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

其中 a i ∈ K a_i \in K aiK K K K 是一个域,通常,我们考虑 K = R K=R K=R K = Z p K=Z_p K=Zp。 注意这里的 x x x 可以理解为一个独立于域 K K K 的一个符号

如:
F ( x ) = ∑ n a n x n F(x) = \sum_na_nx^n F(x)=nanxn
其中a可以是有穷数列,也可以是一个无穷数列

我们通常这么写
a = < 1 , 2 , 3 > → 1 + 2 x + 3 x 2 a = < 1 , 1 , 1 , 1 , 1 > → 1 + x + x 2 + x 3 + x 4 a = < 1 , 1 , 1.... > → ∑ n ≥ 0 x n a=<1,2,3>\rightarrow 1+2x+3x^2\\ a=<1,1,1,1,1>\rightarrow 1+x+x^2+x^3+x^4 \\ a=<1,1,1....>\rightarrow \sum_{n\ge 0}x^n a=<1,2,3>→1+2x+3x2a=<1,1,1,1,1>→1+x+x2+x3+x4a=<1,1,1....>→n0xn
后面的形式就是其生成函数

其实也就是: ( 1 + x ) n (1+x)^n (1+x)n,展开利用二项式定理啊,即 1 + C n 1 x + C n 2 x 2 + ⋯ + c n n x n 1+C_n^1x+C_n^2x^2+ \dots + c_n^n x^n 1+Cn1x+Cn2x2++cnnxn

比如我们在这一堆中选k个,那么方案数就是 x k x^k xk的系数

是不是非常神奇!!!

那么我们现在考虑如下一个问题

两种物体a,b都有无限个,求取出n个的方案数

发现这个东西有两个数列,那么我们就可以根据这两个数列分别构造他们的母函数: A n , B n A_n,B_n An,Bn

怎么把他们搓在一起,解决一共选n个的问题

这个东西就叫做:生成函数卷积

就是 H n = A 0 B n + A 1 B n − 1 . . . A n B 0 H_n=A_0B_n+A_1B_{n-1}...A_nB_0 Hn=A0Bn+A1Bn1...AnB0

下面我们来讨论一下母函数的性质吧

  1. 放缩 < c g 0 , c g 1 , c g 2 , , . . . > ⇒ c G ( x ) = c g 0 , c g 1 , . . . <cg_0,cg_1,cg_2,,...>\Rightarrow cG(x)=cg_0,cg_1,... <cg0,cg1,cg2,,...>⇒cG(x)=cg0,cg1,...
  2. 加减 < f 0 ± g 0 , f 1 ± g 1 , . . . > ⇒ F ( x ) ± G ( x ) = f 0 ± g 0 + f 1 ± g 1 . . . . <f_0\pm g_0,f_1 \pm g_1 ,...>\Rightarrow F(x)\pm G(x) = f_0\pm g_0+f_1 \pm g_1 .... <f0±g0,f1±g1,...>⇒F(x)±G(x)=f0±g0+f1±g1....
  3. 右移 < 0 , 0 , . . . 0 , g 0 , g 1 , . . . > <0,0,...0,g_0,g_1,...> <0,0,...0,g0,g1,...>,前面k个0, ⇒ x k G ( x ) \Rightarrow x^kG(x) xkG(x)
  4. 求导 G ′ ( x ) = g 1 + 2 g 2 x + 3 g 3 x 2 . . . ⇒ < g 1 , 2 g 2 , 3 g 3 , . . > G'(x) = g_1+2g_2x+3g_3x^2... \Rightarrow <g_1,2g_2,3g_3,..> G(x)=g1+2g2x+3g3x2...⇒<g1,2g2,3g3,..>其实就是n-1的方案数

这些性质都非常重要且常用不过这玩意本来也不怎么考就对了

小例题

有两种物体,其中取 i i i 个第 1 1 1种物体的方案数为 a i a_i ai,取 j j j 个第 2 2 2种物体的方案数为 b j b_j bj,求取 k k k 个物体的方案数。

我们不难发现,这个数列 a i , b i a_i,b_i ai,bi就是生成函数本函,我们将他们两个卷起来就很好了


复习了一下字符串

Power Strings

NAJPF - Pattern Find

[ARC181B] Annoying String Problem

[ABC284F] ABCBAC

Writing a Song

Password

<think>嗯,用户遇到了在PyCharm中创建Python 3.12虚拟环境时出现的ModuleNotFoundError,提示缺少&#39;distutils&#39;模块。首先,我需要回忆一下Python的模块结构。distutils曾经是Python标准库的一部分,但根据PEP 632,它在Python 3.10后被弃用,并在Python 3.12中可能被移除了。用户使用3.12版本,所以这个问题可能此有关。 接下来,解决方案方面,可能需要安装替代的模块。我记得setuptools包含了distutils的功能,所以可能用户需要安装setuptools。另外,在Debian或Ubuntu系统中,可能有单独的distutils包需要安装,比如python3.12-distutils。不过用户是在PyCharm里创建环境,可能需要通过系统包管理器或者手动安装。 另外,用户可能没有正确配置Python环境,或者虚拟环境没有继承系统站点的包。这时候可以尝试在创建虚拟环境时加上--system-site-packages选项,让虚拟环境访问系统安装的包。不过这可能带来依赖冲突,需要注意。 还有,检查PyCharm中的解释器路径是否正确,是否指向了正确的Python 3.12安装位置。有时候,如果Python安装不完整,也可能缺少一些模块,这时候重新安装Python或者使用其他发行版如Anaconda可能更好。比如Anaconda可能已经包含了必要的模块,或者通过conda安装会更方便。 然后,用户可能需要更新pipsetuptools到最新版本,因为旧版本可能不兼容Python 3.12。最后,如果所有方法都无效,可能需要降级Python版本到3.10或3.11,暂时避开这个问题。 需要确保用户按照步骤操作,比如在终端中运行安装命令,或者在PyCharm的设置中安装包。同时,要提醒用户注意虚拟环境的激活状态,以及是否正确选择了环境内的解释器。 可能的相关问题包括如何安装其他缺失的模块,或者如何配置CUDA环境变量,但用户当前的问题集中在distutils。所以相关问题可以涉及环境变量配置、虚拟环境管理,或者其他常见ModuleNotFoundError的解决方法。</think>### Python ModuleNotFoundError: No module named &#39;distutils&#39; 解决方案(PyCharm环境) #### 问题原因分析 在Python 3.10及以上版本中,`distutils`模块已逐渐被弃用,部分Python发行版(如精简版或自定义编译版)可能未包含该模块。PyCharm虚拟环境默认不继承系统包时,若底层Python安装不完整,会导致此错误[^1][^2]。 --- #### 分步解决方案 1. **安装`setuptools`替代包** `setuptools`已集成`distutils`的核心功能,执行以下命令: ```bash pip install --upgrade setuptools ``` 若安装后仍报错,继续下一步。 2. **单独安装`distutils`模块(Linux/Ubuntu适用)** 在基于Debian的系统(如Ubuntu)中,通过系统包管理器安装: ```bash sudo apt-get install python3.12-distutils ``` *注:将`3.12`替换为实际Python版本号* 3. **启用系统站点包继承** 在PyCharm中创建虚拟环境时勾选**Allow using global site-packages**,或通过命令创建: ```bash python -m venv --system-site-packages your_env_name ``` 4. **验证Python安装完整性** 检查Python解释器路径是否正确,若使用官方安装包,建议重新安装Python并勾选**Add Python to PATH**选项。 5. **使用Anaconda/Miniconda环境** Anaconda默认包含完整工具链,创建环境: ```bash conda create -n py312 python=3.12 conda activate py312 ``` --- #### 操作验证 在PyCharm终端执行以下代码测试: ```python import distutils.core print("Module loaded successfully") ``` 若未报错,则问题已解决[^1]。 --- #### 扩展建议 - **更新pipsetuptools**: ```bash pip install --upgrade pip setuptools wheel ``` - **检查环境变量**:确保`PYTHONPATH`未指向旧版本Python路径[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值