快速傅里叶变换应用(FFT Applications)
1. 3-SUM
1.1 问题描述
Given three sets \(X\), \(Y\), and $Z $ of \(n\) integers each, determine whether there is a triple \(i \in X, j \in Y, k \in Z\) such that \(i + j = k\).
给定三个包含\(n\)个整数的集合, 每个整数的值都在\(0\)到\(m\)之间, 判断是否有一个三元组\((i, j, k)\)满足\(i \in X, j \in Y, k \in Z\)并且\(i + j = k\).
1.2 解答
算法如下:
- 构造多项式:
\]
\]
其中\(a_i=1\) 当且仅当\(i \in X\)否则\(a_i=0\), \(b_j=1\) 当且仅当\(j \in Y\)否则\(b_j=0\).
- 计算\(C(x)=A(x)\times B(x)\). (利用FFT)
- 多项式\(C(x)\)系数\(c_k\)表示集合\(\set{(i, j)|i\in X,j \in Y, i+j=k}\)的大小, 即选择一个整数\(i \in X\)和一个整数\(j\in Y\), 使得他们的和为\(k\)的方法数.
- 对于每一个\(k\in Z\), 判断\(c_k\)是否大于\(0\), 如果存在一个\(k\)满足条件, 说明可以找到一个三元组\((i, j, k)\)满足\(i \in X, j \in Y, k \in Z\)并且\(i + j = k\).
时间复杂度: FFT需要\(O(m\log m)\), 遍历\(Z\)需要\(O(n)\), 总共\(O(m\log m+n)\).
2. 等距下标
2.1 问题描述
长度为\(n\)的二进制串\(A\)的一组等距下标\((i,j,k)\)满足如下条件:
- \(0\leq i <j<k\leq n-1\),
- \(A[i]=A[j]=A[k]=1\),
- \(k-j=j-i\).
(a) 设计⼀个\(O(n\log n)\)的算法,计算\(A\)中是否存在等距下标.
(b) 设计⼀个\(O(n\log n)\)的算法,计算\(A\)中有多少组等距下标.
2.2 解答
(a) 算法如下:
- 构造多项式:
\]
其中系数\(a[t]=A[t]\).
- 计算\(B(x)=A(x)\times A(x)\). (利用FFT)
- 多项式\(B(x)\)的系数\(b_l\)表示集合\(\set{(p, q)|p,q\in [0,n-1], A[p]=A[q]=1, p+q=l}\)的大小, 即有多少组下标\(p\)和下标\(q\), 满足\(A[p]=A[q]=1\)和\(p+q=l\).
- 判断是否存在\(b_l=2r+1\), 其中\(b_l\)为多项式\(B(x)\)的系数, \(r=1,2,3,\dots\), 如果存在说明存在等距下标.
等距下标\((i, j, k)\)满足\(i+k=2j\), 多项式\(B(x)\)中, \(b_lx{^l}\)表示和为\(l\)且对应位置为1的下标有\(b_l\)组. 所以当\(b_l\)为大于等于3的奇数时, 一定存在等距下标.
*为什么要求为奇数? 为了保证有\(i, j, k\)中的\(j\), 只有和为\(l\)的下标有奇数组,才能保证\(b_l\)组中一定有一组下标为\((j, j)\), 此时才能保证一定有\(i+k=2j\), 即存在等距下标.
(b)
在(a)的基础上, 只需遍历\(B(x)\)的系数, 如果\(b_l\)为大于等于3的奇数, 则最终结果需要加\(\lfloor \frac{b_l}{2} \rfloor\).
未完待续...
快速傅里叶变换应用(FFT Applications)的更多相关文章
- 【知识总结】快速傅里叶变换(FFT)
这可能是我第五次学FFT了--菜哭qwq 先给出一些个人认为非常优秀的参考资料: 一小时学会快速傅里叶变换(Fast Fourier Transform) - 知乎 小学生都能看懂的FFT!!! - ...
- 快速傅里叶变换(FFT)略解
前言 如果我们能用一种时间上比 \(O(n^2)\) 更优秀的方法来计算大整数(函数)的乘法,那就好了.快速傅里叶变换(FFT) 可以帮我们在 \(O(n\log n)\) 的时间内解决问题. 函数乘 ...
- OI中的快速傅里叶变换(FFT)
快速傅里叶变换(FFT) ---- LLpp ...
- 【数学】快速傅里叶变换(FFT)
快速傅里叶变换(FFT) FFT 是之前学的,现在过了比较久的时间,终于打算在回顾的时候系统地整理一篇笔记,有写错的部分请指出来啊 qwq. 卷积 卷积.旋积或褶积(英语:Convolution)是通 ...
- 算法学习笔记(17): 快速傅里叶变换(FFT)
快速傅里叶变换(FFT) 有趣啊,都已经到NOI的难度了,救命 首先,我们先讲述一下前置知识.已经明白的读者请移步后文 虚数 定义:\(z = a + bi\),其中 \(a, b \in R\ \ ...
- 快速傅里叶变换(FFT)算法【详解】
快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...
- 快速傅里叶变换(FFT)学习笔记(未完待续)
目录 参考资料 FFT 吹水 例题 普通做法 更高大尚的做法 定义与一部分性质 系数表达式 点值表达式 点值相乘??? 卷积 复数 单位根 DFT IDFT 蝴蝶迭代优化 单位根求法 实现.细节与小优 ...
- 快速傅里叶变换(FFT)随笔
终于学会了FFT,水一篇随笔记录一下 前置知识网上一大堆,这里就不多赘述了,直接切入正题 01 介绍FFT 这里仅指出FFT在竞赛中的一般应用,即优化多项式乘法 一般情况下,计算两个规模为$n$的多项 ...
- 「算法笔记」快速傅里叶变换(FFT)
一.引入 首先,定义多项式的形式为 \(f(x)=\sum_{i=0}^n a_ix^i\),其中 \(a_i\) 为系数,\(n\) 为次数,这种表示方法称为"系数表示法",一个 ...
- 快速傅里叶变换(FFT)
一.FFT的意义 DFT虽然实现了FT的计算机计算,但是计算量大,不适合实时的数字信号处理.FFT算法的出现,使DFT的计算效率更高,速度更快. 二.FFT与DFT的关系 从FT到DFT经过了数字角频 ...
随机推荐
- NOI模板复习组——图论部分
1.最小生成树: kruscal: #include <cstdio> #include <cmath> #include <cstring> #include & ...
- 微信支付宝app支付回调参数
微信app支付回调通知参数: <xml><appid><![CDATA[wx9703cd*******]]></appid><attach> ...
- 【pytest】执行测试不输出logging日志问题
[一] 今天更新了一波pytest,4.50 -> 6.2.3.执行了一波测试发现之前的logging输出不见了. 看了下启动参数 --log-cli-level=LOG_CLI_LEVEL 加 ...
- nginx二进制安装脚本
#!/bin/bash NGINX_FILE=nginx-1.22.0#NGINX_FILE=nginx-1.20.2#NGINX_FILE=nginx-1.18.0NGINX_URL=http:// ...
- 连接打印机Lodop
<div class="panel-body"> <div class="row show-grid"> <div class=& ...
- RabbitMQ和Erlang兼容对比
参考自 https://blog.csdn.net/qq_28169825/article/details/88294663 兼容对比官网链接 https://www.rabbitmq.com/whi ...
- spring管理配置文件实现注入
创建配置文件 写入以下内容: 创建配置文件的bean: <bean id="configProperties" class="org.springframework ...
- 【Win11】Win11家庭版升级专业版
1.将已激活的Win11家庭版升级成未激活的Win11专业版:输入密钥[BCQNW-3VWYB-4V7QD-M6R2B-7MH26] 2.将未激活的Win11专业版升级成已激活的专业版 :输入密钥[6 ...
- HTML Cookie
目录 Cookie是什么 Cookie的属性 Cookie的作用域 Domain 属性 Path 属性 SameSite 属性 Cookie密码验证小案例 效果展示 代码 Cookie是什么 HTTP ...
- Java包机制与文档注释
Java包机制与文档注释 包机制 为了更好地组织类,java提供包机制,用于区分类名的命名空间 包语句的语法: package pkg1.pkg2.pkg3...; // 必须在文件第一行 一般用公司 ...