zoukankan      html  css  js  c++  java
  • 「学习笔记」单位根反演

    单位根反演

    [[n|k]Leftrightarrow frac1nsum_{i=0}^{n-1} omega^{ik}_ n ]

    (千万记得成 (frac{1}n)

    如果 ([n|k]) 那么除了 (i=0)(1) 外都是 (0)

    反之则用等比数列得到 (frac1n frac{omega_{n}^{nk}-1}{omega_{n}^k-1}=0)

    用处是求某个多项式的特定倍数的系数和,也就是:

    [sum_{i=0}^{lfloorfrac nk floor} [x^{ik}]f(x)=frac1k sum_{j=0}^{k-1}f(omega_{k}^j) ]

    把枚举上界换掉,大力展开之后就行了

    应用

    bzoj3328 PYXFIB

    [sum_{i=0}^{lfloorfrac{n}{k} floor}inom{n}{ik}F_{ik} \% mod ]

    满足 (mod equiv 1 mod k)(F_{ik}) 为斐波那契数列第 (ik)

    • 关键结论:(sum_{i=0}^{n}inom ni A^i=(A+I)^n)(I) 是单位矩阵

      其实也就是矩阵意义下的二项式定理,因为矩阵乘法和加法可以合并进行

    那么把原始展开得到的式子合并完了如下:

    [sum_{i=0}^n[k|i]{nchoose i}f_i=sum_{i=0}^n{nchoose i}f_ifrac{1}{k}sum_{j=0}^{k-1}omega_k^{ji} =frac{1}{k}sum_{j=0}^{k-1}sum_{i=0}^n{nchoose i}f_i(omega_k^j)^i ]

    后面的部分把 (omega_{k}^j) 和矩阵做数乘就行了

    复杂度 (Theta(Tk+8klog n))

    需要预处理原根

    Loj 6485 LJJ学二项式定理

    把几个独立下来之后,考虑 (a_0) 的部分,则有

    [sum_{i=0} ^n inom ni[4|i] s^i a0 ]

    那么换掉式子就是

    [frac 14sum_{i=0}^n sum_{j=0}^3 inom ni s^i w_{j}^i ]

    二项式定理合并即可,对于剩下的几个,被模数就是 (i+k) 其实照样推就行了

    代码很好写

    UOJ450 复读机

    本题也是在某种意义上 (EGF) 第一题

    • ( m{Subtask 1}:d=1)

    直接输出 (k^n) 即可


    以下两个部分均需注意,( m{EGF}) 的卷积最后乘 (n!) 才是正确答案

    • ( m{Subtask 2}:d=2)

    把脑残式子一写:诶这怎么是 (EGF) 卷起来的形式呀?

    [G(x)=sum_{i=0}^{+infty} [2|i] frac{x^i}{i!} ]

    答案即 (G^k(x)[x^n])

    问题似乎陷入了死节,但是使用 (e^x=sumlimits_{i=0}^{+infty} frac{x^i}{i!}) 变换一下:

    [frac{ans}{n!}=[x^n]G^k(x)=[x^n](frac{e^x+e^{-x}}2)^k ]

    使用 (e^{kx}=sumlimits_{i=0}^{+infty} frac{(kx)^i}{i!}) 大力展开所有的取出 (x^n) 的系数,得到:

    [frac{ans}{n!}=frac1{2^k}sum_{i=0}^k inom ki frac{(2i-k)^n}{n!} ]

    使用 (O(k)) 的算法可以快速解决这个问题

    • ( m{Subtask 3}:d=3,kle 1000)

    仍然使用 (G(x)=sumlimits_{i=0}^{+infty} [3|i]frac{x^i}{i!})(k) 次方的系数来计算答案

    这时候很悲惨,莫得 (e^{x}+e^{-x}) 了,但是出现了可以拿单位根反演化开的东西,继续推到不难得到:

    [G(x)=sum_{i=0}^{+infty}frac{x^i}{i!}frac 13 sum_{j=0}^2 omega_{3}^{ij} ]

    (其实 (-1=omega_2^1)

    (frac{1}3) 提出来,把 ((omega_3^j)^i) 和外面合并之后仍然可以使用 (e^{kx}) 的式子简化 (G(x)) 的表达

    [G(x)=frac 13sum_{i=0}^{+infty}frac{(omega_{3}^0x)^i+(omega_{3}^1x)^i+(omega_{3}^2x)^i}{i!}=frac 13(e^{omega_3^0+omega_3^1+omega_3^2}) ]

    这样子再进行 (k) 次方操作就会舒适许多,仍然是二项式定理配合组合意义展开

    [G^k(x)=sum_{i=0}^kinom ki (e^{omega_{3}^0})^{k-i}sum_{j=0}^i inom ij (e^{omega_{3}^1})^j(e^{omega_{3}^2})^{i-j} ]

    那么把 (e) 的次幂堆到一起展开(不放到一起就没法做了)得到

    [frac{ans}{n!}=frac{1}{n!3^k}sum_{i=0}^k sum_{j=0}^i inom kiinom ij (k-i+omega_{3}^2(i-j)+omega_{3}^1j)^n ]

    使用原根 (g=7)(frac{mod-1}3) 来表示单位根

    (Theta(k^2)) 的做法就足够了,代码实现是简单的

  • 相关阅读:
    Laravel框架一:原理机制篇
    Python2.7安装(win7)
    Oracle连接查询
    windows7-PowerDesigner 15.1 的安装图解
    Apache+php+mysql+SQLyog在windows7下的安装与配置图解
    windows7-SQLyog 安装图解
    4个mysql客户端工具的比较
    Windows7-32bit系统安装MySQL-5.5.39-win32.msi服务图解
    win7搭建web服务器
    win7下如何建立ftp服务器
  • 原文地址:https://www.cnblogs.com/yspm/p/15108678.html
Copyright © 2011-2022 走看看