(各种)FFT模板

快速傅里叶变化(FFT)含模板 快速傅里叶变化(FFT) 资料来源:https://www.bilibili.com/video/BV1Y7411W73U 前置知识索引 FFT的核心算法是基于复数和单位根的,并且在算法竞赛中FFT的最普遍应用是求i多项式乘法,或者是卷积。 复数 Complex Number ​ 定义:z=a+bi其中a,b∈R,i=n加法法则:(a+bi)+(c+di)=(a+c)+(b+d)i乘法法则:(a+bi)(c+di)=(ac−bd)+(ad+bc)i欧拉定理:eiθ=cos⁡θ+isin⁡θ 定义:z = 阅读详情

先来一个标准的归并版FFT 2881ms

#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define D double
using namespace std;
struct Z{ D x,y; } a[280010],b[280010],z[280010];
inline Z operator+ (Z x,Z y){ return (Z){x.x+y.x,x.y+y.y}; }
inline Z operator- (Z x,Z y){ return (Z){x.x-y.x,x.y-y.y}; }
inline Z operator* (Z x,Z y){ return (Z){x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x}; }
void FFT(Z* a,Z* b,int l,int r,int g){
	if(l==r) return;
	int m=l+r>>1,n=r-l+1,i,j=l,k=m+1;
	Z w=(Z){cos(2*M_PI/n),g*sin(2*M_PI/n)},z=(Z){1,0};
	for(i=l;i<=r;++i) b[~i&1?j++:k++]=a[i];
	FFT(b,a,l,m,g); FFT(b,a,m+1,r,g);
	for(i=l,j=m-l+1;i<=m;++i,z=z*w){
		a[i]=b[i]+z*b[i+j];
		a[i+j]=b[i]-z*b[i+j];
	}
}
int n,m,M=1,s[280010];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i<=n;++i) scanf("%lf",&a[i].x);
	for(int i=0;i<=m;++i) scanf("%lf",&b[i].x);
	while(M<=max(n,m)) M<<=1; M<<=1;
	FFT(a,z,0,M-1,1);
	FFT(b,z,0,M-1,1);
	for(int i=0;i<M;++i) a[i]=a[i]*b[i];
	FFT(a,z,0,M-1,-1);
	for(int i=0;i<M;++i) s[i]+=int(a[i].x/M+0.5);
	for(int i=0;i<=n+m;++i) printf("%d ",s[i]);
}
让后就可以写一个蝴蝶变换版本的 1097ms

#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define D double
using namespace std;
struct Z{ D x,y; } a[280010],b[280010],z[280010];
inline Z operator+ (Z x,Z y){ return (Z){x.x+y.x,x.y+y.y}; }
inline Z operator- (Z x,Z y){ return (Z){x.x-y.x,x.y-y.y}; }
inline Z operator* (Z x,Z y){ return (Z){x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x}; }
inline Z rt(double X){ return (Z){cos(X),sin(X)}; }
void FFT(Z* a,Z* b,int n,int g){
	for(int i=0,j,k,t;i<n;++i){
		for(j=0,k=i,t=n-1;t;t>>=1,k>>=1) j=(j<<1)|(k&1);
		b[j]=a[i];
	}
	for(int m=2;m<=n;m<<=1){
		Z w=rt(g*M_PI/m),z=(Z){1,0},u,v;
		for(int i=0,k=m>>1;i<k;++i){
			for(int j=i;j<n;j+=m){
				u=b[j]; v=b[j+k]*z;
				b[j]=u+v; b[j+k]=u-v;
			}
			z=z*w;
		}
	}
	for(int i=0;i<n;++i) a[i]=b[i];
}
int n,m,M=1,s[280010];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i<=n;++i) scanf("%lf",&a[i].x);
	for(int i=0;i<=m;++i) scanf("%lf",&b[i].x);
	while(M<=max(n,m)) M<<=1; M<<=1;
	FFT(a,z,M,2);
	FFT(b,z,M,2);
	for(int i=0;i<M;++i) a[i]=a[i]*b[i];
	FFT(a,z,M,-2);
	for(int i=0;i<M;++i) s[i]+=int(a[i].x/M+0.5);
	for(int i=0;i<=n+m;++i) printf("%d ",s[i]);
}
加速蝴蝶变换版本的 620ms

#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define D double
using namespace std;
int n,m,M=1,L,s[280010],r[280010];
struct Z{ D x,y; } a[280010],b[280010],z[280010];
inline Z rt(double X){ return (Z){cos(X),sin(X)}; }
inline Z operator+ (Z x,Z y){ return (Z){x.x+y.x,x.y+y.y}; }
inline Z operator- (Z x,Z y){ return (Z){x.x-y.x,x.y-y.y}; }
inline Z operator* (Z x,Z y){ return (Z){x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x}; }
void FFT(Z* a,Z* b,int n,int g){
	for(int i=0;i<n;++i) b[r[i]]=a[i];
	for(int m=2;m<=n;m<<=1){
		Z w=rt(g*M_PI/m),u,v,z;
		for(int i,k=m>>1,j=0;j<n;j+=m){
			for(z=(Z){1,i=0};i<k;++i,z=z*w){
				u=b[i+j]; v=z*b[i+j+k];
				b[i+j]=u+v; b[i+j+k]=u-v;
			}
		}
	}
	memcpy(a,b,n*sizeof(Z));
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i<=n;++i) scanf("%lf",&a[i].x);
	for(int i=0;i<=m;++i) scanf("%lf",&b[i].x);
	for(;M<=max(n,m);++L) M<<=1; M<<=1;
	for(int i=0;i<M;++i) r[i]=(r[i>>1]>>1)|((i&1)<<L);
	FFT(a,z,M,2);
	FFT(b,z,M,2);
	for(int i=0;i<M;++i) a[i]=a[i]*b[i];
	FFT(a,z,M,-2);
	for(int i=0;i<M;++i) s[i]+=int(a[i].x/M+0.5);
	for(int i=0;i<=n+m;++i) printf("%d ",s[i]);
}

最终版本:490ms

#include<cctype>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define D double
#define Rg register
#define N 280010
using namespace std;
int n,m,M=1,L,s[N],r[N];
struct Z{ D x,y; } a[N],b[N],z[N];
inline Z rt(D X){ return (Z){cos(X),sin(X)}; }
inline Z operator+ (Z x,Z y){ return (Z){x.x+y.x,x.y+y.y}; }
inline Z operator- (Z x,Z y){ return (Z){x.x-y.x,x.y-y.y}; }
inline Z operator* (Z x,Z y){ return (Z){x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x}; }
inline int rd(){  
	int X=0,w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X; 
} 
void FFT(Z* a,Z* b,int n,int g){
	for(int i=0;i<n;++i) b[r[i]]=a[i];
	for(int m=2;m<=n;m<<=1){
		Rg Z w=rt(g*M_PI/m),u,v,z;
		for(Rg int i,k=m>>1,j=0;j<n;j+=m){
			for(z=(Z){1,i=0};i<k;++i,z=z*w){
				u=b[i+j]; v=z*b[i+j+k];
				b[i+j]=u+v; b[i+j+k]=u-v;
			}
		}
	}
	memcpy(a,b,n*sizeof(Z));
}
int main(){
	n=rd(); m=rd();
	for(int i=0;i<=n;++i) a[i].x=rd();
	for(int i=0;i<=m;++i) b[i].x=rd();
	for(;M<=max(n,m);++L) M<<=1; M<<=1;
	for(int i=0;i<M;++i) r[i]=(r[i>>1]>>1)|((i&1)<<L);
	FFT(a,z,M,2);
	FFT(b,z,M,2);
	for(int i=0;i<M;++i) a[i]=a[i]*b[i];
	FFT(a,z,M,-2);
	for(int i=0;i<M;++i) s[i]+=int(a[i].x/M+0.5);
	for(int i=0;i<=n+m;++i) printf("%d ",s[i]);
}

数论版(NTT) 649ms

#include<cctype>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 280010
#define Rg register
#define LL long long
#define M 1004535809 
using namespace std;
int n,m,T,L,r[N],a[N],b[N],z[N]; LL W[N],inv;
inline LL pow(LL x,LL k,LL& s){
	for(s=1;k;x=x*x%M,k>>=1) k&1?s=s*x%M:0;
}
inline int rd(){  
	int X=0; char ch=0;
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return X; 
}
void NTT(int* a,int* b,int n,int g){
	for(int i=0;i<n;++i) b[r[i]]=a[i];
	for(int m=2;m<=n;m<<=1){
		LL w=W[(g?(n/m):(n-n/m))],u,v,z;
		for(int i,k=m>>1,j=0;j<n;j+=m)
			for(z=1,i=0;i<k;++i,z=z*w%M){
				u=b[i+j]; v=z*b[i+j+k]%M;
				b[i+j]=(u+v)%M; b[i+j+k]=(u-v+M)%M;
			}
	}
	memcpy(a,b,n<<2);
}
int main(){
	n=rd(); m=rd();
	for(int i=0;i<=n;++i) a[i]=rd();
	for(int i=0;i<=m;++i) b[i]=rd();
	T=n+m; m=max(n,m); n=1;
	for(;n<=m;++L) n<<=1; n<<=1;
	for(int i=0;i<n;++i) r[i]=(r[i>>1]>>1)|((i&1)<<L);
	pow(3,(M-1)/n,W[*W=1]);
	for(int i=2;i<=n;++i) W[i]=W[i-1]*W[1]%M;
	NTT(a,z,n,1);
	NTT(b,z,n,1);
	for(int i=0;i<n;++i) a[i]=(LL)a[i]*b[i]%M;
	NTT(a,z,n,0);
	pow(n,M-2,inv);
	for(int i=0;i<=T;++i) printf("%lld ",a[i]*inv%M);
}


基于FFT的模板匹配 include “opencv2/core/core.hpp” include “opencv2/imgproc/imgproc.hpp” include “opencv2/highgui/highgui.hpp” include using namespace cv; using namespace std; Mat getTemplateImage(Mat sourc... 阅读详情

相关推荐

FFT 模板 大数相乘

大数乘法 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 给出2个大整数A,B,计算A*B的结果。 Input 第1行:大数A 第2行:大数B (A,B的长度 = 0) Output 输出A * B Input示例 123456 234567 Output示例 2895870

转角的守望 1053

【数论】fft模板

在O(nlogn)时间内将系数表示多项式转化为点值表示,n个点确定一条n−1次的多项式曲线,后者可以O(n)时间内完成高精度乘法。而这n个点的取法是有讲究的,,对,将x的取值扩展到复数域,这些点也称为单位根,定义为ωnk​cosnk​2πisinnk​2π,默认n为2的整数次幂。对于多项式Axa0​a1​xa2​x2...an−1​xn−1将项根据下标的奇偶性分别为两部分,Axa0​a2​。

qq_23096319的博客 603

FFT模板

P3803 多项式乘法模板(FFT) 题意: 给定n次和m次多项式的系数,要求计算这两个多项式乘积的系数 code: #include using namespace std; const double P=acos(-1.0); struct CC{//复数 double x,y; CC(double xx=0,double yy=0){x=xx,y=yy;} CC operator+(const CC &a)const{return CC(x+a.x,y+a.y);} CC operator-(const CC &a)const{return CC(x-a.

FFT模板-附详细注释

学习自:快速傅里叶变换(FFT)详解,【学习笔记】超简单的快速傅里叶变换(FFT)(含全套证明)。 FFT模板 /** *@filename:FFT *@author: pursuit *@created: 2021-08-05 20:57 **/ #include <bits/stdc++.h> #define debug(a) cout << "debug : " << (#a)<< " = " << a << en

pursuit的博客 1199

ENVI+SARscape实战:从哨兵一号数据到地震形变制图全流程解析

本文详细解析了使用ENVI和SARscape软件从哨兵一号数据生成地震形变图的全流程,包括数据获取、干涉处理、相位解缠等关键步骤。通过实战技巧和参数设置建议,帮助用户高效处理SAR数据,提升地震形变监测的精度和可视化效果。

weixin_30460489的博客 385

深入解析DMR协议中的4-CPFSK调制技术与实现

本文深入解析了DMR协议中采用的4-CPFSK调制技术。该技术凭借其连续相位、恒包络的特性,在有限的12.5kHz信道带宽内实现了稳健的通信,有效对抗干扰并提升功放效率,是DMR数字对讲机清晰、稳定通信的核心保障。文章详细阐述了其原理、实现细节及在协议栈中的协同作用。

weixin_29306875的博客 229

模板:FFT

FFT模板 code: #include <bits/stdc++.h> using namespace std; typedef long long ll; bool Finish_read; template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar...

dieyi9889的博客 107

mmpretrain学习笔记

(4)数据集路径 data_root=‘data/imagenet’–》data_root=‘data/Fruits Dataset/images’(7)适当的修改num_workers、epochs、batch_size、lr等。3、训练优化 :梯度下降算法、学习率参数、训练总轮次、学习率变化策略等。my_resnet18_8xb32_in1k.py 完整的配置文件。(6)split=‘train’、split='val’注释掉。2、数据:数据集划分、数据文件路径、批大小、数据增强策略等。

吃葡萄不吐葡萄皮 936

P4721 【模板】分治 FFT(分治fft模板)

P4721 【模板】分治 FFT 题意: 数据范围:2≤n≤1e52\leq n\leq 1e52≤n≤1e5 题解: 学过fft,cdq分治,模板记下来就好。 代码: #include<bits/stdc++.h> using namespace std; const int N=1e5+9; const int mod=998244353; int n,g[N],f[N]; in...

IQ^QI的博客 350

系统架构设计师【第1章】: 绪论 (核心总结)

系统架构 (System Architecture)是系统的一种整体的高层次的结构表示,是系统的骨架和根基,也决定了系统的健壮性和生命周期的长短。系统架构设计师是承担系统架构设计的核心角色,他不仅是连接用户需求和系统进一步设计与实现的桥梁,也是系统开发早期阶段质量保证的关键角色。通俗地说,系统架构 (System Architecture)

数据知道的博客 1万+

Windows 下 OpenClaw(小龙虾) 安装全记录:从零到一的保姆级图文教程(持续更新中)

本文主要介绍了Windows 下 OpenClaw 安装全记录:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程 2.1 步骤一 安装Node.js 2.2 步骤二:安装并配置OpenClaw 2.3 步骤三:配置模型 2.4 步骤四:对话 3. 后续使用步骤

weixin_43178406的博客 16万+

FFT/NTT模板

模板题,多项式乘法 题目链接 0 1 2 a[0] - a[2] X a b c b[0] - b[2] ________________ 0c 1c 2c 0b 1b 2...

蒟蒻 lxw的博客 305

【OpenCV】第二十三章: 图像特征检测之SURF、FAST、BRIEF、OBR算法

4、由于在检测特征点时是需要对图像中所有的像素点进行检测,然而图像中的绝大多数点都不是特征点,如果对每个像素点都进行上述的检测过程,那显然是种浪费,所以FAST采用一种进行非特征点判别的方法:首先对候选点的周围90度的点(1,9,5,13)四个点进行测试,而且是先测试1和9,如果它们两个符合阈值要求再测试5和13。继SIFT和SURF后,大家在特征点检测的速度上又进行了很多的改进尝试,但速度的提升效果都不是非常明显,直到FAST算法诞生,特征点检测的速度才有了一个质的飞跃。无法计算描述符的特征点将被删除。

因为热爱所以坚持 2158

【bzoj2179】FFT快速傅立叶 FFT模板

【bzoj2179】FFT快速傅立叶 FFT模板 2016-06-01 09:34:54 很久很久很久以前写的了。。。 今天又比较了一下效率,貌似手写复数要快很多。 贴一下模板: 1 #include<iostream> 2 #...

anchoupi8353的博客 154

RT-DETR改进策略【卷积层】| ECCV-2024 小波卷积WTConv 增大感受野,降低参数量计算量,独家创新助力涨点

本文记录的是利用模块优化的目标检测网络模型。的目的是在不出现过参数化的情况下有效地增加卷积的感受野,从而解决了在感受野扩展中的参数膨胀问题。本文将其加入到深度可分离卷积中,有效降低模型参数量和计算量,并二次创新,使模块更好地捕捉低频特征,增强网络性能。Wavelet Convolutions for Large Receptive Fields小波卷积及其改进的实现代码如下: 四、创新模块 4.1 改进点1⭐ 模块改进方法:加入(第五节讲解添加步骤)。添加后如下:模块改进方法:基于的(第五节讲解添加步骤)

Limiiiing的博客 1503

使用Qt Creator自带的Qt Designer构造UI界面流程总结

在本文中,我们将总结使用Qt Creator自带的Qt Designer构造UI界面的流程。在对话框中,您可以选择一个控件的信号,然后将其连接到另一个控件的槽。例如,您可以将按钮的点击信号连接到一个槽函数,以响应按钮的点击事件。右键单击窗口设计器中的空白区域,选择适当的布局管理器,如水平布局、垂直布局或网格布局。在Qt Designer中,您可以使用各种预定义的UI控件来设计应用程序的界面。现在,您可以在应用程序的源代码中使用生成的UI界面。在您的源文件中,包含相应的头文件,然后创建一个UI界面的实例。

cl6789的博客 1392

FFT模板+NTT模板

嫖的模板,原理未知,用于多项式乘法。 将a多项式的系数赋值给a[i].x,b多项式的系数赋值给b[i].x然后solve(n,m)即可。 #include<iostream> #include<cstdio> #include<cmath> using namespace std; const int MAX_N=10100000; const double Pi=acos(-1.0); inline int read(){ char c=getchar();

EDGiboy的博客 342

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【模板】FFT模板

FFT模板: #include #include #include #include #define Pi acos(-1.0)//定义Pi的值 #define N 200000 using namespace std; struct complex //定义复数结构体 { double re, im; complex ( doub

Summer_via的博客 365

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

FFT模板(无讲解)

1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1E6+5; 4 const double pi=3.1415926535898; 5 int n,m,limit,r[maxn*4],len; 6 struct com 7 { 8 double a,b; ...

weixin_30896763的博客 119

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

FFT 模板

FFT 模板 #include<bits/stdc++.h> #define ll long long #define N 600005 using namespace std; inline int read(){ int x=0,f...

anchoupi8353的博客 96

matlab 模板匹配fft,基于FFT的模板匹配

include “opencv2/core/core.hpp”include “opencv2/imgproc/imgproc.hpp”include “opencv2/highgui/highgui.hpp”includeusing namespace cv;using namespace std;Mat getTemplateImage(Mat sourceImage);Mat getSqua...

weixin_30646537的博客 499

P3803 【模板】多项式乘法 ——FFT/NTT模板

>>>FFT >>>NTT 要点: ①A(x) = A1(x)+ wnk*A2(x) A(x+n/2) = A1(x)-wnk*A2(x) ②单位圆的两个复数相乘得到的是角度相加后单位圆上对应的复数(模长相乘,极角相加) ③重新转回系数表示,FFT用的是共轭复数,最后还要除以问题的规模 NTT用的是规模的逆元 ④NTT每个规模n下对应的一单...

shadiao.的博客 661
上一篇: Jzoj3528 图书馆
下一篇: Jzoj5542 董先生的钦点
扩展的灰
博客等级 码龄12年 60粉丝 342原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值