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(x)=a_0x+a_1x+\dots+a_mx^m
\]
\[B(x)=b_0x+b_1x+\dots+b_mx^m
\]

其中\(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(x)=a_0x+a_1x+\dots+a_{n-1}x^{n-1}
\]

其中系数\(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)的更多相关文章

  1. 【知识总结】快速傅里叶变换(FFT)

    这可能是我第五次学FFT了--菜哭qwq 先给出一些个人认为非常优秀的参考资料: 一小时学会快速傅里叶变换(Fast Fourier Transform) - 知乎 小学生都能看懂的FFT!!! - ...

  2. 快速傅里叶变换(FFT)略解

    前言 如果我们能用一种时间上比 \(O(n^2)\) 更优秀的方法来计算大整数(函数)的乘法,那就好了.快速傅里叶变换(FFT) 可以帮我们在 \(O(n\log n)\) 的时间内解决问题. 函数乘 ...

  3. OI中的快速傅里叶变换(FFT)

    快速傅里叶变换(FFT)                                                                               ---- LLpp ...

  4. 【数学】快速傅里叶变换(FFT)

    快速傅里叶变换(FFT) FFT 是之前学的,现在过了比较久的时间,终于打算在回顾的时候系统地整理一篇笔记,有写错的部分请指出来啊 qwq. 卷积 卷积.旋积或褶积(英语:Convolution)是通 ...

  5. 算法学习笔记(17): 快速傅里叶变换(FFT)

    快速傅里叶变换(FFT) 有趣啊,都已经到NOI的难度了,救命 首先,我们先讲述一下前置知识.已经明白的读者请移步后文 虚数 定义:\(z = a + bi\),其中 \(a, b \in R\ \ ...

  6. 快速傅里叶变换(FFT)算法【详解】

    快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...

  7. 快速傅里叶变换(FFT)学习笔记(未完待续)

    目录 参考资料 FFT 吹水 例题 普通做法 更高大尚的做法 定义与一部分性质 系数表达式 点值表达式 点值相乘??? 卷积 复数 单位根 DFT IDFT 蝴蝶迭代优化 单位根求法 实现.细节与小优 ...

  8. 快速傅里叶变换(FFT)随笔

    终于学会了FFT,水一篇随笔记录一下 前置知识网上一大堆,这里就不多赘述了,直接切入正题 01 介绍FFT 这里仅指出FFT在竞赛中的一般应用,即优化多项式乘法 一般情况下,计算两个规模为$n$的多项 ...

  9. 「算法笔记」快速傅里叶变换(FFT)

    一.引入 首先,定义多项式的形式为 \(f(x)=\sum_{i=0}^n a_ix^i\),其中 \(a_i\) 为系数,\(n\) 为次数,这种表示方法称为"系数表示法",一个 ...

  10. 快速傅里叶变换(FFT)

    一.FFT的意义 DFT虽然实现了FT的计算机计算,但是计算量大,不适合实时的数字信号处理.FFT算法的出现,使DFT的计算效率更高,速度更快. 二.FFT与DFT的关系 从FT到DFT经过了数字角频 ...

随机推荐

  1. js检测邮箱格式,正则检测邮箱格式

    网上搜了关于邮箱格式的检测,发现很多不太适用,我自己写了一个,可以检测有开头和没开头的,又可以检测@,@qq. 后的格式 var myReg=/^(\w|(\.\w+))+@([a-zA-Z0-9_- ...

  2. 法拉第未来任命新CFO!贾跃亭激动发声

    近段时间以来,贾跃亭旗下的的法拉第未来(Faraday Future,简称 FF)可谓是动作频频. 一天前,有媒体报道称,FF 任命 Zvi Glasman 为其首席财务官.其将负责公司财务.投资者关 ...

  3. 苹果公司对蓝牙免提AT指令的扩充

    介绍 苹果公司对蓝牙HF profile进行了一些HF AT指令的扩充.不过为了兼容起见,尽量实现HF标准规范规定的内容,如果标准规范没有规定相应的内容,为了适配苹果设备新增的功能,还是可以适应苹果公 ...

  4. Windows系统Redis集群搭建

    一.参考网址 https://mp.weixin.qq.com/s/ImdEJTdAmCFJsT55rici0Q 二.Redis版本 注意:搭建windows版的redis集群,redis的版本需要5 ...

  5. daimayuan第三课(哈希,堆)

    1:哈希 建立:拉链法: a:数组 #include <bits/stdc++.h> using namespace std; const int md = 1e9; int h[1000 ...

  6. 初识 Linux Shell

    初识 Linux Shell 本书学习的第一步,就是要找到 Linux 终端的所在位置.目前较常见的图形化终端有 Konsole.Gnome terminal.xterm 等几种.一般安装后在各个发行 ...

  7. 基础实验之access/trunk/valn/vlanif/静态路由

     实验要求 1,PC1,PC2,PC3,PC4分别属于VLAN10,20,30,40 2,PC1,PC2,PC3,PC4互通 步骤1:PC1,2,3,4分别配置IP,并在SW6,SW7分别配置网关,并 ...

  8. 什么是DI

    属性的依赖注入,spring在通过IOC创建对象的时候,如果对象还有属性,就一并给赋值进去DI是在IOC的基础上进行对象的属性注入

  9. Docker部署【项目管理和问题跟踪工具-Redmine】

    创建网络 docker network create redmine-network 启动Mysql数据库 docker run -d --name mysql --network redmine-n ...

  10. 腾讯云等Linux环境下Redis安装配置

    1.下载redis解压安装命令教程 https://www.cnblogs.com/hunanzp/p/12304622.html 2.配置远程连接 修改bind 127.0.0.0  为 bind ...