用途

在\(O(n\log^2 n)\)的时间内做诸如
\[
f_n=\sum_{i=0}^{n-1} f_ig_{n-i}
\]
或是
\[
f_n=\sum_{i=0}^{n-1} f_if_{n-i}
\]
或是
\[
f_{k,n}=\sum_s\sum_t \sum_i f_{s,i}f_{t,n-i}
\]
等“我 卷 我 自 己”的式子。

(如果你觉得这东西多项式求逆也可以做,那么请你认真看一下第三个式子)

思想

式子一

用CDQ分治的思想:先递归做出左边,考虑左边对右边的贡献,然后递归右边。

这其实就是最简单的分治FFT,用多项式求逆也可以实现。

式子二

现在\(g\)也被\(f\)替换了,考虑仍然用上面的做法,但你会发现:你挂了。

为什么会挂呢?

上面的统计贡献的过程是这样的:分治\([l,r]\)时,先做出\([l,mid]\)的\(f\),然后把\([l,mid]\)的\(f\)和\([1,r-l+1]\)的\(g\)卷在一起,把贡献算到\([mid+1,r]\)上面去。

但是现在发现一个漏洞:如果\(g\)替换成了\(f\),那么\([1,r-l+1]\)的\(f\)可能还没有被完全算出来。

什么时候会发生这种情况呢?考虑分治结构其实和线段树结构相同,满足左边的大小\(\ge\)右边的大小,所以只有在最左边的那个区间可能会发生这种事,也就是\(l=1\)时。

那怎么办?怎么提前算出右边?

我也不知道

既然不能提前算出来,那就不算,只算出\(f\)在\([l,mid]\)的值对右边的贡献之后直接往右边递归。

显然,一个点不能对自己产生贡献,所以递归到一个点的时候肯定是对的。

而两个点时可以算出\(l\)对\(r\)的贡献,也是对的。

以此类推,它就是对的。

(完全严谨的证明我也不会啊qwq)

注意:当\(l\ne 1\)时把\([l,mid]\)和\([1,r-l+1]\)卷起来时相当于钦定一个指针在\([l,mid]\),而另一个在\([1,r-l+1]\),但实际上他们有可能会交换位置,所以要乘2。

update:我都写了些啥……其实就是把两个卷起来的时候有两个指针,在右边的那个指针位置统计贡献,所以直接递归右边完全莫得问题。当卷积并不是二次方而是三次方、四次方的时候也照样可以在最右边的那个位置统计贡献。

式子三

这个式子真是丑呢……

然而直接用式子二的方法就可以了,方法并没有太大不同,除了……

注意:当\([l\ne 1]\)时¥%……&@&¥%¥,也相当于钦定了指针的位置,所以还要交换来一遍。

这么说可能比较难理解,考虑这么一个式子:
\[
f1_n=\sum_i f1_if2_{n-i}\\
f2_n=\sum_i f2_if1_{n-i}
\]
这时你不能简单地把\(f1[l,mid]\)和\(f2[1,r-l+1]\)卷起来,还要把\(f2[l,mid]\)和\(f1[1,r-l+1]\)卷起来,这才能做到不重不漏。

代码

代码现在不在我电脑上,我又那么懒,所以——

咕咕咕……

(建议去 https://www.cnblogs.com/yinwuxiao/p/9570533.html 食用代码/kel)

分治FFT学习笔记的更多相关文章

  1. 分治 FFT学习笔记

    先给一道luogu板子题:P4721 [模板]分治 FFT 今天模拟有道题的部分分做法是分治fft,于是就学了一下.感觉不是很难,国赛上如果推出式子的话应该能写出来. 分治fft用来解决这么一个式子\ ...

  2. 多项式求逆/分治FFT 学习笔记

    一.多项式求逆 给定一个多项式 \(F(x)\),请求出一个多项式 \(G(x)\), 满足 \(F(x) * G(x) \equiv 1 ( \mathrm{mod\:} x^n )\).系数对 \ ...

  3. 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)

    再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...

  4. 快速傅里叶变换(FFT)学习笔记

    定义 多项式 系数表示法 设\(A(x)\)表示一个\(n-1\)次多项式,则所有项的系数组成的\(n\)维向量\((a_0,a_1,a_2,\dots,a_{n-1})\)唯一确定了这个多项式. 即 ...

  5. 快速傅里叶变换(FFT)学习笔记(其一)

    再探快速傅里叶变换(FFT)学习笔记(其一) 目录 再探快速傅里叶变换(FFT)学习笔记(其一) 写在前面 为什么写这篇博客 一些约定 前置知识 多项式卷积 多项式的系数表达式和点值表达式 单位根及其 ...

  6. 快速傅里叶变换(FFT)学习笔记(其二)(NTT)

    再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 写在前面 一些约定 前置知识 同余类和剩余系 欧拉定理 阶 原根 求原根 NTT ...

  7. 口胡FFT现场(没准就听懂了)&&FFT学习笔记

    前言(不想听的可以跳到下面) OK.蒟蒻又来口胡了. 自从ZJOI2019上Day的数论课上的多项式听到懵逼了,所以我就下定决心要学好多项式.感觉自己以前学的多项式都是假的. 但是一直在咕咕,现在是中 ...

  8. 【笔记篇】(理论向)快速傅里叶变换(FFT)学习笔记w

    现在真是一碰电脑就很颓废啊... 于是早晨把电脑锁上然后在旁边啃了一节课多的算导, 把FFT的基本原理整明白了.. 但是我并不觉得自己能讲明白... Fast Fourier Transformati ...

  9. 【文文殿下】快速傅里叶变换(FFT)学习笔记

    多项式 定义 形如\(A(x)=\sum_{i=0}^{n-1} a_i x^i\)的式子称为多项式. 我们把\(n\)称为该多项式的次数界. 显然,一个\(n-1\)次多项式的次数界为\(n\). ...

随机推荐

  1. ASP.NET Core依赖注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来. 服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了 ...

  2. Feign 客户端调用错误

    1.@RequestBody 必须要写在实现接口中 2.Feign 客户端调用的时候如果有参数的话,默认是发送post请求 3.服务接口中的请求参数必须要加上@RequestParam("r ...

  3. Redis—简介

    1.Redis是什么? 是一个速度非常快的非关系型数据库,即NoSql数据库(non-relational database) 可以将存储在内存的Key-Value数据持久化到硬盘,可以使用复制特性来 ...

  4. vue.js+DRF跨域访问图片

    一.背景 在前后端分离过程时,后端服务器只开放本地接口,而前端则开放IP接口,在DRF响应请求时,会把域名(locahost+port)响应给前端服务器,前端服务器把再把数据响应给浏览器,浏览器在解析 ...

  5. .gitignore文件的写法

    有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files .... 解决的方法就是在gi ...

  6. H5 - flexbox 弹性盒布局和布局原理

    新版的flexbox规范分两部分:一部分是container,一部分是 items. flexbox是一整套布局规范,包含了多个css属性,所以学习起来比`float: left;` 这样简单的布局要 ...

  7. python网络爬虫之爬取图片

    今天使用requests和BeautifulSoup爬取了一些图片,还是很有成就感的,注释可能有误,希望大家多提意见: 方法一:requests import requests from bs4 im ...

  8. DataTable通过Select进行过滤

    DataTable方法测试 //测试DataTable的select DataTable dt = new DataTable(); //a.OrderType, //a.[Status] dt.Co ...

  9. SpringBoot自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题

    [转]https://www.cnblogs.com/NeverCtrl-C/p/8191920.html 1 servlet简介 servlet是一种用于开发动态web资源的技术 参考博客:serv ...

  10. P1280 尼克的任务[区间覆盖dp]

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...