wyz 和她的故事

· · 休闲·娱乐

wyz 和她的故事。

防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透防剧透

前置知识

泰勒展开

f(x) = \sum_{i=0} \frac{f^{(i)}(x_0)}{i!}(x-x_0)^i

广义二项式定理

(a+b)^r = \sum_{i=0} \binom{r}{i} a^{r-i} b^{i}

其中实数的组合数通过下降幂定义。即

\binom{r}{c} = \frac{r^{\underline{c}}}{c}

单位根

众所周知,n 次方程有 n 个根。所以方程 x^n=1n 个根。

x = \cos\theta + i\sin\theta,则 x^n = \cos n\theta + i\sin n\theta = 1,所以 n\theta = 2k\pi\theta = k\frac{2\pi}{n}。则第 k 个根为 x = \cos k\frac{2\pi}{n} + i\sin k\frac{2\pi}{n}

\omega_n^k = \cos k\frac{2\pi}{n} + i\sin k\frac{2\pi}{n},则 \omega_n^0 \sim \omega_n^{n-1} 就是一组单位根。但事实上我们也可能会用到 \omega_n^k(k\ge n) 的。

性质:

  1. \omega_n^a\omega_n^b = \omega_n^{a+b}
  2. (\omega_n^a)^b=\omega_n^{ab}
  3. \omega_n^a=\omega_n^{a \bmod n}

单位根反演

[ a \mid n ] = \frac{1}{n} \sum_{i=0}^{n-1} \omega_n^{ai}

证明:分类讨论

多项式

参考资料:https://www.luogu.com.cn/article/v7vgqau1

FFT

我们有两个多项式,显然它们的积可以用暴力方法计算,时间复杂度 O(n^2) 。但是,我们可以通过 快速傅里叶变换 降低其复杂度至 O(n \log n)

多项式的积不好直接计算,但数值的积可以快速计算。因此我们要想方法把多项式转化成点值表示,这样把点值乘起来再逆变换回去就可以了。

那我们代入什么值呢?显然自然数不行。因为多项式多点求值在 我们还没发明出 FFT 暴力计算多项式乘法时都是 O(n^2) 的。但天才的傅里叶想到可以把单位根代入。那么问题就转化成了如何快速求出 F(x)\omega_n^0,\omega_n^1,...,\omega_n^{n-1} 处的值。

这个显然不好直接计算,于是我们采用分治的思想。对于一个多项式 F(x),我们把它分成两半,把次数为奇数的项和偶数的项分开,再提出一个 x,再换掉其中的 x^2。如 x^5+x^4+4x^3+5x^2+x+4=x^4+5x^2+4+x^5+4x^3+x=[(x^2)^2+5(x^2)+4]+x[(x^2)^2+4(x^2)+1]。于是我们可以得到两个新的多项式 G(x)H(x),使得 F(x)=G(x^2)+xH(x^2)。由于我们每次都要把它分成两半,不妨假设长度 n2 的幂次。

那么假设我们已经求出 G(x)H(x) 的点值表示了。不妨代入 \omega_n^k\omega_n^{k+\frac{n}{2}},那么我们可以得到

F(\omega_n^k)=G((\omega_n^k)^2)+\omega_n^kH((\omega_n^k)^2) F(\omega_n^{k+\frac{n}{2}})=G((\omega_n^{k+\frac{n}{2}})^2)+\omega_n^{k+\frac{n}{2}}H((\omega_n^{k+\frac{n}{2}})^2)

F(\omega_n^k)=G(\omega_\frac{n}{2}^k)+\omega_n^kH(\omega_\frac{n}{2}^k) F(\omega_n^{k+\frac{n}{2}})=G(\omega_\frac{n}{2}^k)-\omega_n^kH(\omega_\frac{n}{2}^k)

有了这两个式子,我们就可以快速求出点值了。这就是 离散快速傅里叶变换,简称 DFT。

分治的过程如图(来自 https://www.luogu.com.cn/article/v7vgqau1):

时间复杂度显然 O(n \log n)

然后考虑如何把点值转化回多项式。

假设序列 F 做 DFT 之后得到的序列为 G。则有 G_k=\sum_{i=0}^{n-1}(\omega_n^k)^i F_i。则有 F_k=\frac{1}{n}\sum_{i=0}^{n-1}(\omega_n^{-k})^i G_i。证明的话,代入然后等比数列求和分讨即可。

这就是 离散快速傅里叶变换的逆变换,简称 IDFT。

发现这个式子与原式只有单位根取了另一半,且最后除了个 n。因此写的时候可以封装在一起。

但先别急。容易发现这样常数很大,有没有什么快一点的方法呢?

注意到如果我们不递归实现,就可以减小很多常数。因此我们可以先把每一位交换到它最后会在的地方,然后向上归并实现。考虑每一位最后会到哪里。若当前最低位为 0,则变换后它会到前一半,否则会到后一半。显然就是 2 进制下翻转了一下。可以递推求出。然后我们只需枚举当前的区间长度(2,4,8,...),并枚举区间,用上面的式子计算就行了。

::::info[实现]

(嗯复数类啥的就不放了)

其中 sz 是大于卷积后式子长度的最小的 2 的幂。

for(int i=0;i<sz;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
void FFT(compld *a,int n,int op)
{
    for(int i=0;i<n;i++) if(i<rev[i]) std::swap(a[i],a[rev[i]]);
    for(int mid=1;mid<n;mid<<=1)
    {
        compld omega(cos(PI/mid),op*sin(PI/mid));
        for(int len=mid<<1,i=0;i<n;i+=len)
        {
            compld o(1,0),x,y;
            for(int j=0;j<mid;j++,o=o*omega)
                x=a[i+j],y=o*a[i+j+mid],a[i+j]=x+y,a[i+j+mid]=x-y;
        }
    }
    if(op==-1) for(int i=0;i<n;i++) a[i].x=(int)(a[i].x/n+0.5);
}
FFT(a,sz,1),FFT(b,sz,1);
for(int i=0;i<sz;i++) a[i]*=b[i];
FFT(a,sz,-1);

::::

NTT

在大多数题目中,我们需要将结果取模,且需要避免浮点数运算。而且 FFT 常数较大,有没有快一点的方法呢?

当然是有的。但为了避免复数运算,我们需要在模意义下找到类似单位根的数。回想一下我们学过的数论知识,可以想到 原根

原根 B 满足 B^k \equiv 1 \pmod pk 最小。为了使原根能充当 FFT 用的单位根,我们需要让 k2 的幂次且尽可能大。我们把这类模数称为 NTT 模数。比较常见的 NTT 模数有 998244353=7\times17\times2^{23}+1,最小原根为 3

于是只要对上面的稍微改一下即可。

:::info[实现]

void ntt(int *a,int n,int op)
{
    for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
    for(int mid=1,len=2;mid<n;mid<<=1,len<<=1)
        for(int i=0,g=qpow(op>0?B:iB,(mod-1)/len);i<n;i+=len)
            for(int j=0,x,y,o=1;j<mid;j++,o=1ll*o*g%mod)
                x=a[i+j],y=1ll*o*a[i+j+mid]%mod,a[i+j]=rd(x+y),a[i+j+mid]=pr(x-y);
    if(op<0)
    {
        int iv=qpow(n,mod-2);
        for(int i=0;i<n;i++) a[i]=1ll*a[i]*iv%mod;
    }
}

:::

MTT

有的时候模数不是 NTT 模数,那怎么办呢?

这时可以使用任意模数多项式乘法或三模 NTT。

三模 NTT 很简单,就是对三个 NTT 模数都做一遍 NTT 然后用 CRT 合并。

普通的任意模数多项式乘法(MTT)我不会。

多项式牛顿迭代

有函数 G(x,y),求一多项式满足 G(x,f(x)) \equiv 0 \pmod{x^n}

考虑倍增。在 n=1 时单独求出答案。下面讨论 n\ge 2 时的情况。

假设现在已经得到了模 x^{\lceil \frac{n}{2} \rceil} 意义下的解 f'。将 G(x,f(x))f(x)f(x)=f'(x) 处泰勒展开,得

\sum_{i=0} \frac{ \frac{\partial^i G}{\partial y^i}(x,f'(x)) }{i!} (f(x)-f'(x))^i \equiv 0 \pmod{x^n}

注意到 f(x)=f'(x)f(x)-f'(x) 的最低次项次数为 \lceil \frac{n}{2} \rceil,所以对于 i>1,有 (f(x)-f'(x))^i \equiv 0 \pmod{x^n}

所以有

\begin{aligned} & \quad \sum_{i=0} \frac{ \frac{\partial^i G}{\partial y^i}(x,f'(x)) }{i!} (f(x)-f'(x))^i \\ &\equiv G(x,f'(x)) + \frac{\partial G}{\partial y}(x,f'(x))(f(x)-f'(x)) \equiv 0 \pmod{x^n} \\ \end{aligned}

因此

f(x) \equiv f'(x) - \frac{G(x,f'(x))}{\frac{\partial G}{\partial y}(x,f'(x))} \pmod{x^n}

多项式乘法逆

使用多项式牛顿迭代。

设给的函数为 h(x),则 G(x,y)=\frac{1}{y}-h(x)。所以有

\begin{aligned} f(x) &\equiv f'(x) - \frac{\frac{1}{f'(x)}-h(x)}{-\frac{1}{f'^2(x)}} \\ &\equiv 2f'(x)-f'^2(x)h(x) \pmod{x^n} \end{aligned}

另一种倍增法与牛顿迭代本质相同,不提。

时间复杂度均为 O(n \log n)

多项式 ln

设给定的函数为 f(x)。求 \ln f(x)

考虑先求导然后积分。有

\frac{\mathrm{d} \ln f(x) }{\mathrm{d} x} \equiv \frac{f'(x)}{f(x)} \pmod{x^n}

所以

\mathrm{d} \ln f(x) \equiv \frac{f'(x)}{f(x)} \mathrm{d} x \pmod{x^n}

因此

\begin{aligned} \ln f(x) &\equiv \int \mathrm{d} \ln f(x) \\ &\equiv \int \frac{f'(x)}{f(x)} \mathrm{d} x \pmod{x^n} \end{aligned}

所以先求导,再求逆,然后乘法,最后积分即可。

时间复杂度为 O(n \log n)

多项式 exp

O(n \log^2 n) 的分治 FFT 做法,但 我不会 有更优的做法,所以不讲。

考虑牛顿迭代。设给的函数为 h(x),则 G(x,y)=\ln y-h(x)。所以有

\begin{aligned} f(x) & \equiv f'(x) - \frac{\ln f'(x)-h(x)}{\frac{1}{f'(x)}} \\ & \equiv f'(x)(1 - \ln f'(x) + h(x) ) \pmod{x^n} \end{aligned}

时间复杂度 O(n \log n)

多项式快速幂

一种朴素的想法是类似普通快速幂一样。时间复杂度 O(n \log n \log k),其中 k 为次数。

如果多项式长度较小,那么可以做到时间复杂度为 O(\max(n,k) \log k),但是一定要每次随着多项式长度改变卷积长度。

对于一般情况,由于

F(x)^k = \exp(k \ln F(x))

所以可以先做一次多项式 \ln,再做多项式 \exp,注意 k 在指数上是应模 \varphi(P)。时间复杂度 O(n \log n)

多项式开方

一种思路是模仿多项式快速幂,有

\sqrt{F(x)} = \exp(\frac{1}{2} \ln F(x))

多项式 \ln 后乘 \frac{1}{2}\exp 即可。

也可以使用多项式牛顿迭代。设给的函数为 h(x),则 G(x,y)=y^2-h(x)。所以有

\begin{aligned} f(x) &\equiv f'(x) - \frac{f'(x)^2 - h(x)}{2f'(x)} \\ &\equiv \frac{f'(x)^2 + h(x)}{2f'(x)} \pmod{x^n} \end{aligned}

时间复杂度均为 O(n \log n)

分治 NTT

设有 n 个一次多项式,需要求出它们的乘积。朴素的暴力乘是 O(n^2) 的,但我们可以通过分治加速计算。

具体地,假设当前的分治区间为 [l,r],将它分成 [l,m](m,r] 两个区间。假设两边的结果都已计算好,这时我们用 O((r-l+1) \log (r-l+1)) 多项式乘法合并两边的答案。

可以得到当问题规模为 n 时,时间复杂度为 T(n) = 2T(\frac{n}{2}) + O(n \log n)。得 T(n) = O(n \log^2 n)

不会。

分治 NTT 一般是用来解决一些半在线卷积之类的。

对于分治区间,我们求出几个多项式表示分治区间对答案所造成的影响,然后向上合并。

看看例题吧。

P4721 【模板】分治 FFT

P9164 「INOH」Round 1 - 狂气

循环卷积

循环卷积是一个用于解决指数取模的小技巧。

P5224 Candies

::::info[problem]{open}

给定 nmk,求

\sum_{i \bmod m = k} \binom{n}{i} :::: ::::info[solution] 显然答案为 $$ \sum_{i \bmod m = k} [x^i] (x+1)^n $$ 朴素的快速幂加卷积是 $O(n \log^2 n)$ 的。 考虑在卷积的时候合并一部分对答案贡献等价的结果。可以发现 $x^p$ 前的系数与 $x^{p \bmod m}$ 前的系数对答案的贡献是一样的,因此我们可以把当前次数大于等于 $m$ 的那几项系数向下平移 $m$。 这样就是 $O(m \log m \log n)$ 了。 :::: # 生成函数 ## OGF **普通生成函数**(OGF)可以把数列转化成多项式。具体的,序列 $\{a_n\}$ 的 OGF 为 $F(x)=\sum_{i=0} a_i x^i$。 这玩意有啥用呢?假设我们有序列 $a$ 和 $b$,我们要求出它们 **卷积** 的结果,即一个序列 $c$ 使得 $c_i=\sum_{j=0}^i a_j b_{i-j}$,那么就有 $\operatorname{OGF}(c)=\operatorname{OGF}(a)\times\operatorname{OGF}(b)$。于是我们就可以用多项式乘法快速求出结果。 以下是一些基本数列的 OGF,请自行推导: ::::info[$\operatorname{OGF}(\{ 1,1,...\})=\frac{1}{1-x}$] 使用等比数列求和公式。 $$ \operatorname{OGF}(\{ 1,1,...\}) = \sum_{i=0} x^i = \frac{1}{1-x} $$ :::: ::::info[$\operatorname{OGF}(\{ 1,a,a^2,...\})=\frac{1}{1-ax}$] 使用等比数列求和公式。 $$ \operatorname{OGF}(\{ 1,a,a^2,...\}) = \sum_{i=0} (ax)^i = \frac{1}{1-ax} $$ :::: ::::info[$\operatorname{OGF}(\{ 0,1,1,... \})=\frac{x}{1-x}$] $$ \operatorname{OGF}(\{ 0,1,1,...\}) = \sum_{i=1} x^i = x \sum_{i=0} x^i = \frac{x}{1-x} $$ :::: ::::info[$\operatorname{OGF}(\{ 1,0,1,0,1,... \})=\frac{1}{1-x^2}$] $$ \operatorname{OGF}(\{ 1,0,1,0,1,...\}) = \sum_{i=0} x^{2i} = \sum_{i=0} (x^2)^i = \frac{1}{1-x^2} $$ :::: ::::info[$\operatorname{OGF}(\{ \binom{n}{0} , \binom{n}{1} , \binom{n}{2} , ... \})=(x+1)^n$] 使用二项式定理。 $$ \operatorname{OGF}(\{ \binom{n}{0} , \binom{n}{1} , \binom{n}{2} , ... \}) = \sum_{i=0} \binom{n}{i} x^i = (x+1)^n $$ :::: ### 斐波那契数列的 OGF OGF 也可以帮助我们根据递推式求出一些数列的通项公式。比如斐波那契数列。已知 $f_0=0$,$f_1=1$,$f_i=f_{i-1}+f_{i-2}(i\le2)$,求 $f$ 的通项公式。 设 $f$ 的 OGF 为 $F(x)$。由递推式可知 $$ F(x)=xF(x)+x^2F(x)+x $$ 解得 $$ F(x)=\frac{x}{1-x-x^2} $$ 不妨假设 $$ F(x)=\frac{A}{1-ax}+\frac{B}{1-bx}=\frac{(A+B)-(Ab+Ba)x}{1-(a+b)x+abx^2} $$ 则有 $$ \left\{\begin{array}{l} A+B=0 \\ Ab+Ba=-1 \\ a+b=1 \\ ab=-1 \end{array}\right. $$ 解得 $$ \left\{\begin{array}{l} A=\frac{1}{\sqrt5} \\ B=-\frac{1}{\sqrt5} \\ a=\frac{1+\sqrt5}{2} \\ b=\frac{1-\sqrt5}{2} \end{array}\right. $$ 又由于 $$ \frac{A}{1-ax}=\sum_{i=0} Aa^ix^i $$ 所以 $$ F(x)=\sum_{i=0} \frac{1}{\sqrt5}\left(\left(\frac{1+\sqrt5}{2}\right)^i-\left(\frac{1-\sqrt5}{2}\right)^i\right)x^i $$ 则 $$f_n=\frac{1}{\sqrt5}\left(\left(\frac{1+\sqrt5}{2}\right)^n-\left(\frac{1-\sqrt5}{2}\right)^n\right)$$ 对于大部分递推式都可以用此方法求出通项公式。特别地,若分母因式分解时出现重根,那么应以不同次数写出。如有因式 $(x-x_0)^k$,则需要 $(x-x_0),(x-x_0)^2,...,(x-x_0)^k$ 都出现一次。 #### 小技巧:扩域 有时我们会想在模意义下计算斐波那契数列的第 $n$ 项 $f_n$,但是 $\sqrt5$ 在模意义下不一定存在。这时我们就需要用到 **扩域**。 用类似复数的思想,定义 $i^2 \equiv g \pmod P$,则可以用一个类表示 $a+bi$ 形式的数。加减法就是对两项系数加,乘法符合分配率,于是拆一下即可,除法需要分子分母同时乘分母的共轭后化简。 一般来说答案的“虚部”都为 $0$,取“实部”即可。 ### 卡特兰数的 OGF 再比如说卡特兰数。有 $f_n=\sum_{i=0}^{n-1} f_i f_{n-i-1}$。设其 OGF 为 $F(x)$,则显然有 $$ F(x)=xF(x)^2+1 $$ 解得 $$ F(x)=\frac{1\pm\sqrt{1-4x}}{2x}=\frac{2}{1\mp\sqrt{1-4x}} $$ 代入 $x=0$,取分母不为 $0$ 的一根,得 $$ F(x)=\frac{1-\sqrt{1-4x}}{2x} $$ 尝试用广义二项式定理将根号项展开 $$ \begin{aligned} \sqrt{1-4x} &= (1-4x)^\frac{1}{2} \\ &= 1+ \sum_{i=1} \binom{\frac{1}{2}}{i} (-4x)^i \\ &= 1+ \sum_{i=1} \frac{\left(\frac{1}{2}\right)^{\underline{i}}}{i!} (-4x)^i \\ \end{aligned} $$ 由于 $$ \begin{aligned} \left(\frac{1}{2}\right)^{\underline{n}} &= \frac{1}{2} \cdot \frac{-1}{2} \cdot \cdots \cdot \frac{-(2n-3)}{2} \\ &= \frac{(-1)^{n-1}(2n-3)!!}{2^n} \\ &= \frac{(-1)^{n-1}(2n-2)!}{2^n(2n-2)!!} \\ &= \frac{(-1)^{n-1}(2n-2)!}{2^{2n-1}(n-1)!} \\ \end{aligned} $$ 其中 $!!$ 表示双阶乘,即 $\displaystyle n!! = \prod_{i\ge0,n-2i>0} (n-2i)$。 所以 $$ \begin{aligned} \sqrt{1-4x} &= 1+ \sum_{i=1} \frac{\frac{(-1)^{i-1}(2i-2)!}{2^{2i-1}(i-1)!} \\}{i!} (-4x)^i \\ &= 1- \sum_{i=1} \frac{(2i-2)!}{(i-1)!i!} \frac{(-1)^{i-1}(-4x)^i}{2^{2i-1}} \\ &= 1- \sum_{i=1} \binom{2i-1}{i} \frac{1}{(2i-1)} 2x^i \\ \end{aligned} $$ 因此 $$ \begin{aligned} F(x) &= \frac{1}{2x}\sum_{i=1} \binom{2i-1}{i} \frac{1}{(2i-1)} 2x^i \\ &= \sum_{i=1} \binom{2i-1}{i} \frac{1}{(2i-1)} x^{i-1} \\ &= \sum_{i=0} \binom{2i+1}{i+1} \frac{1}{(2i+1)} x^i \\ &= \sum_{i=0} \binom{2i}{i} \frac{1}{(i+1)} x^i \\ \end{aligned} $$ 所以 $$ f_n = \binom{2n}{n} \frac{1}{n+1} $$ --- ### 题目 ::::info[problem]{open} $$ \left\{\begin{array}{l} a_n = 2a_{n-1} + 4^{n-1} \\ a_0 = 1 \end{array}\right. $$ 求 $a_n$ 通项公式。 :::: ::::info[solution] 设数列 $\{a_n\}$ 的 OGF 为 $F(x)$。则有 $$ F(x) = 2xF(x) + 1 + \sum_{i=1} 4^{i-1} x^i $$ 即 $$ (1-2x) F(x) = \frac{1-3x}{1-4x} $$ 得到 $$ F(x) = \frac{1-3x}{(1-4x)(1-2x)} $$ 设 $$ F(x) = \frac{A}{1-4x}+\frac{B}{1-2x} $$ 通分后比较系数得 $$ \left\{\begin{array}{l} -2A-4B=-3 \\ A+B=1 \end{array}\right. $$ 解得 $$ \left\{\begin{array}{l} A= \frac{1}{2} \\ B= \frac{1}{2} \end{array}\right. $$ 代回原式 $$ \begin{aligned} F(x) &= \frac{\frac{1}{2}}{1-4x}+\frac{\frac{1}{2}}{1-2x} \\ &= \sum_{i=0} ( \frac{1}{2} 4^i + \frac{1}{2} 2^i ) x^i \\ \end{aligned} $$ 所以 $$ a_n = \frac{1}{2}(4^n+2^n) $$ :::: --- ### [P10780 BZOJ3028 食物](https://www.luogu.com.cn/problem/P10780) ::::info[problem]{open} 带一些食物,但每种都有限制: 承德汉堡:偶数个; 可乐:$0$ 个或 $1$ 个; 鸡腿:$0$ 个,$1$ 个或 $2$ 个; 蜜桃多:奇数个; 鸡块:$4$ 的倍数个; 包子:$0$ 个,$1$ 个,$2$ 个或 $3$ 个; 土豆片炒肉:不超过一个; 面包:$3$ 的倍数个; 求带 $n$ 个的方案数。$1\leq n\leq 10^{500}$。 :::: ::::info[solution] 考虑每种食物的 OGF,答案就是它们的乘积。 每种食物的 OGF 为: + $\sum_{i=0} x^{2i} = \frac{1}{1-x^2}

乘起来得到:

\frac{x(x+1)^2(x^2+x+1)(x^3+x^2+x+1)}{(1-x^2)^2(1-x^3)(1-x^4)}=\frac{x}{(1-x)^4}

将除化为乘:

x(1+x+x^2+...)^4

发现其等于选 4 个数使和等于 n-1 的个数。插板法可得答案为

\binom{n+2}{3}=\frac{n(n+1)(n+2)}{6}

::::

P2000 拯救世界

::::info[problem]{open}

为了拯救世界,小 a 和 uim 决定召唤出 kkksc03 大神和 lzn 大神。召唤出任何一位大神,都需要使用金木水火土五种神石。具体方法如下:

kkksc03 大神召唤方法: 金神石的块数必须是 6 的倍数; 木神石最多用 9 块; 水神石最多用 5 块; 火神石的块数必须是 4 的倍数; 土神石最多用 7 块。

lzn 大神召唤方法: 金神石的块数必须是 2 的倍数; 木神石最多用 1 块; 水神石的块数必须是 8 的倍数; 火神石的块数必须是 10 的倍数; 土神石最多用 3 块。

求用 n 块神石召唤两位大神的方案数。10^{99999}\leq n\lt 10^{100000}

::::

::::info[solution]

列出每一位大神和每一种神石的 OGF,并乘起来:

\frac{1}{1-x^6} \cdot \frac{1-x^{10}}{1-x} \cdot \frac{1-x^6}{1-x} \cdot \frac{1}{1-x^4} \cdot \frac{1-x^8}{1-x} \cdot \frac{1}{1-x^2} \cdot (x+1) \cdot \frac{1}{1-x^8} \cdot \frac{1}{1-x^{10}} \cdot \frac{1-x^4}{1-x}

化简得

\frac{1}{(1-x)^5}

即为

(1+x+x^2+...)^5

发现答案为将 n 划分成 5 个数的方案数。插板法得答案为

\binom{n+4}{4} = \frac{(n+4)(n+3)(n+2)(n+1)}{24}

高精计算即可(乘法使用 NTT)。

::::

P4451 [国家集训队] 整数的lqp拆分

::::info[problem]{open}

求整数 n 的有序拆分方式的权值和。一种拆分 a_i 的权值为 \prod F_{a_i},其中 F_n 表示斐波那契数列的第 n 项。

::::

::::info[solution]

1 个数时,答案的 OGF 为

F(x) = \frac{x}{1-x-x^2}

考虑选 k 个数。此时答案的 OGF 为 F(x)^k。则选任意个数时,答案的 OGF 为

\begin{aligned} G(x) &= \sum_{i=0} F(x)^i \\ &= \frac{1}{1-F(x)} \\ &= \frac{1-x-x^2}{1-2x-x^2} \end{aligned}

使沿用上边的方法,得到

\begin{aligned} G(x) &= 1+ \frac{-\frac{\sqrt2}{4}}{1-(1-\sqrt2)x} + \frac{\frac{\sqrt2}{4}}{1-(1+\sqrt2)x} \\ &= 1+ \sum_{i=0} \left[ - \frac{\sqrt2}{4} (1-\sqrt2)^i + \frac{\sqrt2}{4} (1+\sqrt2)^i \right] x^i \\ \end{aligned}

所以答案为

[x^n] G(x) = \frac{\sqrt2}{4}\left[(1+\sqrt2)^n-(1-\sqrt2)^n\right]

注意到 \sqrt2 \equiv 59713600 \pmod {1000000007}\sqrt2 \equiv 940286407 \pmod {1000000007},直接计算即可。注意 n\varphi(mod) 取模。

::::

EGF

定义数列 \{a_n\}指数型生成函数 (EGF)为 \hat F(x)=\sum_{i=0} \frac{a_i}{i!}x^i

EGF 有什么用呢?考虑如下问题:将 n 个有标号的球染成红色或蓝色,求方案数。

从生成函数的角度考虑。若其中有 i 个红球的方案数为 f_i,有 i 个蓝球的方案数为 g_i,则答案为

\sum_{i+j=n} \binom{n}{i} f_i g_j

把组合数拆开(常用技巧)得:

\begin{aligned} \sum_{i+j=n} \frac{n!}{i!j!} f_i g_j = n! \sum_{i+j=n} \frac{f_i}{i!} \frac{g_j}{j!} \end{aligned}

假设答案为 h_n,则

\frac{h_n}{n!} = \sum_{i+j=n} \frac{f_i}{i!} \frac{g_j}{j!}

所以!

\hat H(x) = \hat F(x) \hat G(x)

由此例,我们可以发现 EGF 的一个重要性质:

\hat G(x) = \prod \hat F_i(x) \Leftrightarrow g_n = \sum_{\sum a_i = n} \binom{n}{a_1,a_2,...} \prod f_{i,a_i}

因此我们借助 EGF 来较快地处理含有组合数特别是多重组合数的问题。

EGF exp 的组合意义

考虑有 n 个不同的球,把它们放入几个相同的盒子中。设 k 个球放入一个盒子中权值为 w_k,令 F(x) = \sum_{i=0} w_i x^i

当放入 k 个盒子中时,考虑盒子顺序的方案数的 EGF 为 F(x)^k,但是盒子相同,所以方案数要除以 k!。所以答案的 EGF 为

G(x) = \sum_{i=0} \frac{F(x)^i}{i!} = \exp(F(x))

由此我们可以得到 EGF exp 后的结果为元素构成集合的生成集族的权值之和。此处生成集的权值为其中所有集合元素的权值积。

::::warning[\exp(F(x))\frac{1}{1-F(x)} 的区别]

$\frac{1}{1-F(x)}$ 一般用于 OGF,且考虑划分集合之间的顺序。 :::: --- 下面是一些数列的 EGF,请试着推导: ::::info[$\operatorname{EGF}(\{ 1,1,... \})=e^x$] 使用 $e^x$ 的泰勒展开。 $$ \operatorname{EGF}(\{ 1,1,... \}) = \sum_{i=0} \frac{x^i}{i!} = e^x $$ :::: ::::info[$\operatorname{EGF}(\{ 1,a,a^2,a^3,... \})=e^{ax}$] $$ \operatorname{EGF}(\{ 1,a,a^2,... \}) = \sum_{i=0} \frac{ax^i}{i!} = e^{ax} $$ :::: ::::info[$\operatorname{EGF}(\{ 1,0,1,0,1,... \})=\frac{e^{x}+e^{-x}}{2}$] 由于 $$ \operatorname{EGF}(\{ 1,1,1,... \}) = e^{x} $$ $$ \operatorname{EGF}(\{ 1,-1,1,... \}) = e^{-x} $$ 两式相加除以二得 $$ \operatorname{EGF}(\{ 1,0,1,... \} = \frac{ \operatorname{EGF}(\{ 1,1,1,... \}) + \operatorname{EGF}(\{ 1,-1,1,... \}) }{2} = \frac{e^x+e^{-x}}{2} $$ :::: ::::info[$\operatorname{EGF}(\{ 0,1,0,1,0,... \})=\frac{e^{x}-e^{-x}}{2}$] 同上,加改成减。 :::: --- ### 题目 ::::info[problem]{open} 有 $2$ 面红旗,$2$ 面黄旗,$2$ 面蓝旗,求取出 $1\sim5$ 面旗可以生成多少种本质不同的序列。 :::: ::::info[solution] 考虑每种旗的 EGF,为 $$ 1+x+\frac{1}{2}x^2 $$ 那么答案的 EGF 为每种旗的 EGF 乘起来的结果,即 $$ (1+x+\frac{1}{2}x^2) ^3 = \frac{1}{8}x^6+\frac{3}{4}x^5+\frac{9}{4}x^4+4x^3+\frac{9}{2}x^2+3x+1 $$ 答案为 $$ \frac{3}{4}\times5!+\frac{9}{4}\times4!+4\times3!+\frac{9}{2}\times2!+3\times1! = 90+54+24+9+3 = 180 $$ :::: --- ### [P2012 拯救世界2](https://www.luogu.com.cn/problem/P2012) ::::info[problem]{open} 普通人基因序列由 A、C、G、T 构成,创世神 JOHNKRAM 不是普通人(是个胖纸),基因序列也不一样。除了这四种普通的,还有乾、兑、离、震、巽、坎、艮、坤八种特殊基因。其中乾、坎、艮、震属阳,只能出现奇数次;坤、兑、离、巽属阴,只能出现偶数次。 现在只知道创世神 JOHNKRAM 的基因序列共有 n 位,其他一概不知。小a 和 uim 想知道他们最多要试多少次,才能召唤出创世神 JOHNKRAM 。这个数字有可能很大,所以输出答案模 $10^9$ 即可。 **形式化题意**:有一个序列由 $1\sim12$ 的数构成,$5\sim8$ 只能出现奇数次,$9\sim12$ 只能出现偶数次,$1\sim4$ 无限制。求长为 $n$ 的序列的个数。 :::: ::::info[solution] 对每类数考虑其 EGF。 $$ F(x) = e^x \\ G(x) = \frac{e^x+e^{-x}}{2} \\ H(x) = \frac{e^x-e^{-x}}{2} \\ $$ 则答案的 EGF 为 $$ \begin{aligned} A(x) &= (F(x)G(x)H(x))^4 \\ &= \frac{1}{256}[e^x(e^x+e^{-x})(e^x-e^{-x})]^4 \\ &= \frac{1}{256}(e^{3x}-e^{-x})^4 \\ &= \frac{1}{256}(e^{12x}-4e^{8x}+6e^{4x}-6+e^{-4x}) \end{aligned} $$ 答案为 $$ \begin{aligned} n![x^n]A(x) &= n! \times \frac{1}{256} (\frac{12^n}{n!}-\frac{4\times8^n}{n!}+\frac{6\times4^n}{n!}-\frac{6}{n!}+\frac{(-4)^n}{n!}) \\ &= \frac{12^n-4\times8^n+6\times4^n-6+(-4)^n}{256} \end{aligned} $$ 直接计算即可。但 $256$ 在模 $10^9$ 意义下没有逆元,所以把它从后面先约去。使用扩展欧拉定理加速计算,不提。 :::: --- ### [P10588 「ALFR Round 2」D 超立方体](https://www.luogu.com.cn/problem/P10588) ::::info[problem]{open} 在 $n$ 维中,我们有 $n$ 维超立方体,它有 $2^n$ 个点。 其棱长为 $1$,且所有顶点的各维坐标都是非负整数。 我们从点 $(0,0,\dots,0)$ 出发,走过 $m$ 条棱,求到达点 $(1,1,\dots,0)$ 的方案总数。 其中要到达的点的坐标中有 $l$ 个数字 $1$。 由于答案可能很大,你只需要输出方案数对 $998244353$ 取模后的结果就可以了。 **形式化题意**:有 $n$ 个数 $1 \sim n$,求它们组成长为 $n$ 的序列满足 $1\sim l$ 出现奇数次且 $l+1 \sim n$ 出现偶数次的方案数。 :::: ::::info[solution] 易得答案为 $$ \sum_{a\in \mathbb{N}^n}[\sum a_i = m][\forall 1 \le i \le l,a_i \bmod 2 =1 ][\forall l < i \le n,a_i \bmod 2 =0 ] \begin{pmatrix} n \\ a_1,a_2,...,a_n \\\end{pmatrix} $$ **对于含有组合数的式子,考虑构造其 EGF。** 对于前 $l$ 个数,翻转次数为奇,EGF 为 $\sum_{i=0} \frac{x^{2i+1}}{(2i+1)!}$。对于后 $n-l$ 个数,翻转次数为偶,EGF 为 $\sum_{i=0} \frac{x^{2i}}{(2i)!}$。 故答案的 EGF 为 $$\hat F(x) = \left( \frac{e^x-e^{-x}}{2} \right) ^ l \left( \frac{e^x+e^{-x}}{2} \right) ^ {n-l} $$ 则答案为 $$ \begin{aligned} & \quad m! [x^m]\hat F(x) \\ &= m! [x^m] \left( \frac{e^x-e^{-x}}{2} \right) ^ l \left( \frac{e^x+e^{-x}}{2} \right) ^ {n-l} \\ &= m! (2e)^{-n} [x^m] (e^{2x}-1)^l (e^{2x}+1)^{n-l} \end{aligned} $$ 令 $G(x)=(x-1)^l(x+1)^{n-l}$。设其 $x^i$ 项系数为 $g_i$。**对其求导**,得 $$ \begin{aligned} G'(x) &= l(x-1)^{l-1}(x+1)^{n-l} + (n-l)(x+1)^{n-l-1}(x-1)^{l} \\ &= (x-1)^{l-1}(x+1)^{n-l-1} (l(x+1)+(n-l)(x-1)) \\ &= (x-1)^{l-1}(x+1)^{n-l-1} (nx+2l-n) \end{aligned} $$ 所以 $$(x-1)(x+1)G'(x)=(nx+2l-n)G(x)$$ 比较两边系数,得 $$(i-1)g_{i-1}-(i+1)g_{i+1}=ng_{i-1}+(2l-n)g_i$$ $$g_{i+1}=\frac{(i-n-1)g_{i-1}+(n-2l)g_i}{i+1}$$ 代回原式: $$ \begin{aligned} & \quad m![x^m]\hat F(x) \\ &= m! (2e)^{-n} [x^m] \sum_{i=0}^n g_i \left(e^{2x}\right)^i \\ &= m! 2^{-n} [x^m] \sum_{i=0}^n g_i e^{(2i-n)x} \\ &= 2^{-n} \sum_{i=0}^n g_i (2i-n)^{m} \end{aligned} $$ :::: ### [AT_abc387_g [ABC387G] Prime Circuit](https://www.luogu.com.cn/problem/AT_abc387_g) ::::info[problem]{open} 求编号为 $1$ 到 $n$ 的 $n$ 个顶点的简单无向连通图 $G$ $G$ 中任意回路的边数均为素数的图的数量对 $998244353$ 取模的结果。此处回路定义为允许重复经过顶点但**不允许**重复经过边的闭路径。其中 $1 \leq n \leq 2.5 \times 10^5$。 :::: ::::info[solution] 结论:**图为点仙人掌,且每个环长为质数。** 证明:考虑有两个连着的环且均长为质数,则它们拼起来形成的环路长为偶数,不合题意。 引理(**扩展 Cayley 公式**):**在 $n$ 个点 $m$ 个联通块间连 $m-1$ 条边形成一个联通块的方案数为 $n^{m-2}$。** 既然这样,我们对每个环(也可以一个是点)分别考虑。 令一个大小为 $k$ 的环的权值为 $c_k$,一个点权值的 EGF 为 $$ F(x) = \sum_{i=0} \frac{c_i}{i!} $$ 答案为 $$ [x^n] \sum_{k=0} \frac{F(x)^k}{k!} = [x^n] \exp F(x) $$ 可能还要乘上一个系数。证明考虑 EGF $\exp$ 的组合意义。 现在来求 $c_k$。首先它一定包含 $k$ 个点成环的方案数,为 $\frac{(k-1)!}{2}$;但是还要考虑连通块之间的贡献。不妨给每个环的权值再乘上 $n$,这时左式就会包含 $n^k$,最后再对所有情况除以 $n^2$ 即可。 即 $$ c_k = \left\{\begin{array}{l} n, k=1 \\ \frac{(k-1)!}{2}, k \text{ is odd prime} \\ 0, \text{otherwise} \end{array}\right. $$ 答案为 $$ \frac{1}{n^2} [x^n] \exp F(x) $$ :::: ## DGF

\gdef\isp{\text{ is prime}} \gdef\otw{\text{otherwise}} \gdef\eps{\epsilon}

*~~走错片场了~~既来之则安之。不会数论。* 定义数列 $\{ a_n \}$ 的 **狄利克雷生成函数**(DGF)为 $\tilde F(s) = \sum_{n=1} \frac{a_n}{n^s}$。 考虑两个数列 $f$ 和 $g$ 的 DGF 乘起来会怎么样。 $$ \tilde F(s) \tilde G(s) = \sum_{n_1=1} \frac{f_{n_1}}{n_1^s} \sum_{n_2=1} \frac{g_{n_2}}{n_2^s} = \sum_{n=1} \sum_{n_1 n_2 = n} \frac{ f_{n_1} g_{n_2} }{n^s} = \sum_{n=1} \sum_{d \mid n} \frac{}{} $$ 因此两个数列的 DGF 之积等于它们狄利克雷卷积的 DGF。 如果 $f(n)$ 是数论函数,那么 $\tilde F(s)$ 可以表示成其在素因子幂上取值 DGF 的乘积。 $$ \tilde F(s) = \prod_{p\isp} \left( \sum_{i=0} \frac{f(p^i)}{p^{is}} \right) $$ 试试看! ::::info[$1(n)$] $$ \tilde 1(s) = \zeta(s) = \sum_{n=1} \frac{1}{n^s} $$ ($\zeta$ 函数的定义。) 考虑使用素数处的取值,得 $$ \tilde 1(s) = \prod_{p\isp} \left( \sum_{i=0} \frac{1}{p^{is}} \right) = \prod_{p\isp} \frac{1}{1-p^s} $$ :::: ::::info[$\mu(n)$] 由于 $$ \mu(p^k) = \left\{ \begin{array}{l} 1 ,k=0 \\ -1 ,k=1 \\ 0 ,\otw \end{array}\right. $$ 所以 $$ \tilde \mu(s) = \prod_{p\isp} (1-p^s) $$ 因此我们发现 $$ \tilde \mu(s) \zeta(s) = 1 $$ 即 $$ \mu * 1 = \eps $$ :::: ## 二元 GF 字面意思。 ### [P7950 [✗✓OI R1] 后方之水](https://www.luogu.com.cn/problem/P7950) ::::info[problem]{open} 记 $$ f(\{a_i\}_{i=1}^n) = \left\{\begin{array}{l} a_1 , n=1 \\ \min_{x,y} \{a_x a_y + f((\{a_i\}\setminus \{a_x\} \setminus \{a_y\}) \cup \{a_x+a_y\}) \} , \text{otherwise} \end{array}\right. $$ 给定 $n$,$S$,求 $$ \sum_{\sum_{i=1}^n a_i = S} f(\{a_i\}_{i=1}^n) $$ :::: :::info[solution] o↑b↓ser↑va↓tion↑:$\min$ 是假的.当 $n>1$ 时, $$ \exist c, s.t. \forall x,y, a_x a_y + f((\{a_i\}\setminus \{a_x\} \setminus \{a_y\}) \cup \{a_x+a_y\}) = c $$ 证明:考察初始的一堆石子,在合并的过程中,它总与其它所有堆石子都产生了一对乘积的贡献。 考虑使用二元 GF。答案为 $$ \begin{aligned} &\quad [x^2 y^S] \left( \sum_{i=1} (ix+1) y^i \right)^n \\ &= [x^2 y^S] \left( \frac{xy}{(1-y)^2} + \frac{y}{1-y} \right)^n \\ &= [x^2 y^S] \left( \frac{xy+y-y^2}{(1-y)^2} \right)^n \\ &= [x^2 y^{S-n}] \left( \frac{x+(1-y)}{(1-y)^2} \right)^n \\ &= [x^2 y^{S-n}] \frac{(x+(1-y))^n}{(1-y)^{2n}} \\ &= [y^{S-n}] (1-y)^{-2n} [x^2] (x+(1-y))^n \\ &= [y^{S-n}] (1-y)^{-2n} (1-y)^{n-2} \binom{n}{2} \\ &= \binom{n}{2} [y^{S-n}] (1-y)^{-n-2} \\ &= \binom{n}{2} \binom{S+1}{n+1} \end{aligned} $$ :::: # 想她了 有更好的标题欢迎投稿 qwq $$ \gdef\DP#1{^{\underline#1}} \gdef\UP#1{^{\overline#1}} $$ ## 组合数 $\binom{n}{m}$ 表示在 $n$ 个有标号小球中选出 $m$ 个小球的方案数。 根据组合意义,考虑选出来的球的顺序,方案数为 $n\DP{m}$,但是这样会有 $m!$ 种重复情况,除一下得到 $$ \binom{n}{m} = \frac{n!}{m!(n-m)!} $$ 根据组合意义,枚举第 $n$ 个球选或不选,可得 $$ \binom{n}{m} = \binom{n-1}{m-1} + \binom{n-1}{m} $$ ## 范德蒙德卷积 下指标求和: $$ \sum_{i} \binom{n}{i} \binom{m}{k-i} = \binom{n+m}{k} $$ 组合意义:考虑 $n+m$ 个有标号球,前 $n$ 个选 $i$ 和,后 $m$ 个选 $k-i$ 个,方案数等于 $n+m$ 个球选 $k$ 个。 代数推导: $$ \begin{aligned} &\quad \sum_k \binom{n+m}{k}x^k \\ &= (x+1)^{n+m} \\ &= (x+1)^n (x+1)^m \\ &= \sum_{i} \binom{n}{i} x^i \sum_{j} \binom{m}{j} x^j \\ &= \sum_{k} \binom{n}{i} \binom{m}{k-i} x^k \\ \end{aligned} $$ 上指标求和: $$ \sum_{i} \binom{i}{x} \binom{n-i}{y} = \binom{n}{x+y} $$ 证明类似。