• FFT专练


    就多项式乘法这个地方不太熟 再多巩固一下.

    LINK:[ZJOI2014力](https://www.luogu.com.cn/problem/P3338)

    把$(j-i)^2$看成一个函数 可以发现是一个卷积 FFT优化即可.

    LINK:[TJOI2017DNA](https://www.luogu.com.cn/problem/P3763)

    这道题还是FFT匹配字符串的应用,怎么匹配我不再赘述 其实就是翻转一下相乘一下...

    考虑怎么求答案 可以最多有三个位置不同 我们很难处理这个问题。。

    由于只有4种字符 我们逐一进行FFT 求值 最后某个位置累和<=3那么 就是答案啦

    LINK:[任意模数NTT](https://www.luogu.com.cn/problem/P4245)

    我对多项式什么的 一点都不敏感 反而越发的生疏 看来得学一下生成函数了 这样我的代数水平估计会上涨很多 对。

    任意的模数NTT 这就越发的难搞 我们这个时候一般考虑选取几个有原根的模数 并且三个模数的乘积大于最终结果的理论最大值 进行三次NTT 再把每一项用中国剩余定理给合并起来 再搞9次DFT 为什么是9次?我也不太懂。。。

    这里利用的做法是拆系数FFT... 由于答案的上界为$10^9*10^9*10^5=10^{23}$我们只需要搞精度足够高的多项式乘法就能保证不掉精。

    首先把每个数字拆成 $a*2^15+b$的形式 那么显然 $a,bleq 2^15$

    有 $c_1*c_2=(a_1*2^{15}+b_1)(a_2*2^{15}+b_2) o =a_1*a_2*2^{30}+(a_1*b_2+a_2*b_1)*2^{15}+b_1*b_2$

    这样我们只需要7次FFT 但是众所周知 FFT常数大的很 所以 还需要继续化简..

    懒的优化 就这样信仰跑吧... 当然 我的精度暴力 开long double 才过 不太清楚为什么 可能精度是刚好卡边的 精度不够.. long double nb。

    [SDOI2015序列统计](https://www.luogu.com.cn/problem/P3321)

    好题,首先要知道一个暴力 f[i][j]...

    再者 我们发现 转移方程 $f[i+1][j*k]+=f[i][j]; o f[i+1][c]+=f[i][j] (jcdot k mod m==c)$

    这个东西已经是dp的复杂度下界了 状态 空间 转移没有再优化的余地了 遗憾的是这是一个 $nm^2$的做法。

    其实要是 说优化我们还有一种对于这种式子进行优化的方法 即快速幂优化法。

    f[i][j]和f[i][k]进行合并 我们不难得到f[i*2][c] 对 第一项进行快速幂即可。

    这样我们就得到了一个 $m^2logn$的优秀做法 但是 还是通过不了这道题目。

    再观察转移 乘法变加法 我们发现了什么 卷积...

    于是我们考虑如何把乘法变成加法这还是有点难度的。

    指数函数和对数函数都能使得乘法变成加法。

    我们要设定一个很棒的映射 使得 原来的乘法运算完全变成加法之间的运算。对数指数都可以 下面我考虑一下指数。

    也就是我们期望$a*bmod m==c o (A+B)mod (m-1)==C$

    其中A,B,C为$k^A==a,k^B==b...$不难发现k一定是m的原根不然不能做到一一映射。

    考虑如果是原根会出现这样的效果么 可以发现是正确的所以我们把每个数字映射到指数上即可.

    这个非常严肃的问题 原根怎么求?

    我们可以根据定义求但是太耗时 不妨我们枚举原根G 然后对phi(p)分解质因数如果g满足对于所有$p_i$有$g^{frac{phi(p)}{p_i}}mod p!=1$

    那么这个数字就是原根。值得一提的是这道题的模数为1004535809 这玩意是一个费马质数 即 NTT常用模数...

    [AH2017礼物](https://www.luogu.com.cn/problem/P3723)

    这道题还是很好推的 列出来式子 推一发 很容易发现是一个卷积 FFT掉精度很严重 不如使用NTT...

    其实原本我是 mnlogn准备暴力...但其实把c带进去发现一次NTT即可...

    值得一提的是 我又没有很好的理解题目意思 以为是只有一个手环可以加c 两个都是可以的。我的语文也是服了..

    [luogu4841城市规划](https://www.luogu.com.cn/problem/P4841)

    本来是打算练习EGF的 但是看题解也没能看懂EGF的做法是为什么也不会多项式exp 所以就咕了。

    考虑不用EGF来做这道题好了。

    题目的意思是求n个点的一张有标号无向联通图的数目。这是基于无向联通图是基于一棵树再随便加几条边形成的概念.

    设f[i]表示 由i个点组成的无向联通图的个数。显然 $f[i]=sum_{s=1}^{i-1}f[s]C_{i-1}^s*(2^s-1)f[i-s]$

    含义不再多说 但是会出现问题 方案可能算重,因为我们可能枚举到了1生成2也可能枚举到了2生成了1

    总之多种方案被同时枚举到了 原因是 前后可能出现翻转什么的 当然也不可能最后除以二什么的 没有那么简单...有些方案重复了 有些方案没有重复。

    重新更改dp式 我们发现 i这个点虽然沟通了若干个联通块我们强制让其先让其沟通的式1所在的连通块。随着1所在的连通块逐渐变大可以保证前后不可能重复枚举到,是不是很妙哇。那么有 $f[i]=sum_{s=1}^{i-1}f[s]C_{i-2}^{s-1}*(2^s-1)f[i-s]$

    很显然 这是一个分治FFT 复杂度nlogn^2.

    不太行这个复杂度。我们考虑容斥来降低时间复杂度 考虑一个生成图的方案数$2^{C_n^2}$ 用这个东西容斥设为g_i表示i个点的图的数量.

    $f_i=g_i-...$要减去不合法的方案数 怎么算不合法的,考虑不合法等于部分合法+完全不合法。

    或者还是说 不合法方案显然由几个连通块构成我们暴力枚举其中的一个连通块s,剩下的方案显然为$g_{i-s}$

    可以发现那个联通块s的方案数为$f_s$值得一提的是这里还是存在刚才的那个问题 我们枚举到1 算出的2 和枚举到2算出的1这两者是等价的,所以我们故技重施还是采用枚举1所在的连通块的方法来去重。

    所以$f_i=g_i-sum_{s=1}^{i-1}C_{i-1}^{s-1}f_sg_{i-s}$发现这个式子还是可以分治FFT来做的。 但是 和刚刚一样还没有那么的清晰 再继续往下推一波..

    $f_i=g_i-sum_{s=1}^{i-1}frac{(i-1)!}{(s-1)!(i-s)!}f_sg_{i-s}$

    发现展开也没啥用(~~不如再合上~~)不过有利于我们分治FFT...

    那就合上吧 再两边都除以(i-1)!

    可以得到 $frac{f_i}{(i-1)!}=frac{g_i}{(i-1)!}-frac{sum_{s=1}^{i-1}C_{i-1}^{s-1}f_sg_{i-s}}{(i-1)!}$

    合并一下$frac{sum_{s=1}^{i}C_{i-1}^{s-1}f_sg_{i-s}}{(i-1)!}=frac{g_i}{(i-1)!}$

    约分一下$sum_{s=1}^{i}frac{f_s}{(s-1)!}frac{g_{i-s}}{(i-s)!}=frac{g_i}{(i-1)!}$

    分别 设A B C等于上述三个多项式 那么显然 $Acdot B=C o A=Ccdot B^{-1}$

    B C这两个多项式的值都很好求 求一波逆即可.但是我忘了逆怎么求了 这里先写一发 分治FFT算了...

    分治FFT都写了3h 我是sb 自闭了.

  • 相关阅读:
    Zookeeper安装
    JDK安装(Linux)
    Zookeeper简介
    修改tomcat配置解决定时任务多次重复执行
    解决.net mvc session超时的问题
    C#- JSON的操作
    Android SharedPreferences的理解与使用
    大屏适配:flexible.js的源码及配置
    charles抓包工具,抓手机端https设置
    Sanic二十:Sanic 扩展之sanic-openapi生成接口文档之sanic-openapi支持的数据类型
  • 原文地址:https://www.cnblogs.com/chdy/p/12322350.html
Copyright © 2020-2023  润新知