zoukankan      html  css  js  c++  java
  • 序列反演的一些技巧和感悟

    I.Preface

    一般来说,我们称以下这种关系叫做反演:

    [A_x=sum_{i=0}^{+infty}k(i,x)cdot B_i Leftrightarrow B_x=sum_{i=0}^{+infty}mu(i,x)cdot A_o ]

    常见的反演有二项式反演、莫比乌斯反演、子集反演、斯特林反演、单位根反演、拉格朗日反演等等。

    为什么需要反演?

    有了反演,在很多计数问题中可以有声东击西、围魏救赵、甚至指鹿为马、曲径通幽的效果。我们可以求出其它的一个在我们能力范围内的量,然后把我们要的东西通过反演求出来。这时反演的价值所在。

    II.常见反演

    1.二项式反演

    [A_n=sum_{i=0}^n (-1)^icdot egin{pmatrix} n \ i end{pmatrix}cdot B_i Leftrightarrow B_n=sum_{i=0}^x(-1)^icdot egin{pmatrix} n \ i end{pmatrix}cdot A_i ]

    [A_n=sum_{i=0}^n egin{pmatrix} n \ i end{pmatrix}cdot B_i Leftrightarrow B_n=sum_{i=0}^n(-1)^{n-i}cdot egin{pmatrix} n \ i end{pmatrix}cdot A_i ]

    [A_n=sum_{i=n}^{+infty} (-1)^icdot egin{pmatrix} i \ n end{pmatrix}cdot B_i Leftrightarrow B_n=sum_{i=n}^{+infty}(-1)^icdot egin{pmatrix} i \ n end{pmatrix}cdot A_i ]

    [A_n=sum_{i=n}^{+infty} egin{pmatrix} i \ n end{pmatrix}cdot B_i Leftrightarrow B_n=sum_{i=n}^{+infty}(-1)^{i-n}cdot egin{pmatrix} i \ n end{pmatrix}cdot A_i ]

    其中最下面这个式子最重要!二维形式:

    [A_{n,m}=sum_{i=n}sum_{j=m} egin{pmatrix} i \ n end{pmatrix}cdot egin{pmatrix} j \ m end{pmatrix}cdot B_{i,j} Leftrightarrow B_{n,m}=sum_{i=n}sum_{j=m}(-1)^{i+j}egin{pmatrix} i \ n end{pmatrix}cdot egin{pmatrix} j \ m end{pmatrix}cdot A_{i,j} ]

    二维形式的其它写法也是将一维形式的系数直接相乘以可,证明可以用两次一维形式的反演得到。

    2. 莫比乌斯反演

    [f(n)=sum_{dmid n}g(d) Leftrightarrow g(n)=sum_{dmid n}mu(d)f(frac{n}{d}) ]

    [f(n)=sum_{n|d}g(d) Leftrightarrow g(n)=sum_{n|d}mu(frac{d}{n})f(d) ]

    3. 斯特林反演

    我懒得打了,反正用的少......待补充吧!

    III.Usage

    纸上谈兵无用,下面直入主题,如何用呢?先说什么时候用吧!题目中有"恰好"字眼的

    比如说 [HAOI2018]染色 中的这段话:

    然而小 C 只关心序列的 (N) 个位置中出现次数恰好为 (S) 的颜色种数, 如果恰好出现了 (S) 次的颜色有 (K) 种, 则小 C 会产生 (W_k) 的愉悦度.

    再比如 [MtOI2018]情侣?给我烧了!

    你的任务是求出当 (k = 0, 1, ... , n) 时,共有多少种不同的就坐方案满足恰好(k) 对情侣是和睦的。

    这时可以先旁敲侧击地求出一些量,然后峰回路转用反演定理把我们要求地量求回来。

    一般来说这种题目求的那个量往往是"指定有 (k) 个的满足条件",这时和"恰好有 (k) 个"刚刚好可以用二项式反演。如染色这题中,设 (G_k) 为指定了 (k) 中颜色,其他任意的方案;(F_k) 为恰好 (k) 中颜色的方案,于是有:

    [G_k=egin{pmatrix} m \ S end{pmatrix} cdot frac{n!}{(S!)^kcdot(2n-2k)!}cdot (m-k)^{n-kS}=sum_{i=k}^{min(frac{n}{S},m)} egin{pmatrix} i \ k end{pmatrix}cdot F_i ]

    然后使用二项式反演,并使用 ntt 加速,就可以 (O(nlog n)) 完成这道题了。

    还有就是用来解决 (sum [gcd(i,j)=C]) 一类问题,详情可以看我的另一篇博客 SP20173 DIVCNT2 - Counting Divisors (square)

    as 0.4123
  • 相关阅读:
    Python-枚举
    Python-函数
    Python-装饰器(语法糖)上下五千年和前世今生
    Python-全局函数(内置方法、内置函数)
    Python-时间模块-time
    Python-随机模块-random
    Python-维护排序好的序列模块-bisect
    需求推动技术的产生
    RBF神经网络
    聚类算法的衡量指标
  • 原文地址:https://www.cnblogs.com/Linshey/p/14402959.html
Copyright © 2011-2022 走看看