首页 > 其他分享 >快速傅里叶变换复习笔记

快速傅里叶变换复习笔记

时间:2024-07-09 19:45:27浏览次数:18  
标签:opt 复习 cc double FFT long 笔记 300005 傅里叶

  • .real()成员函数
  • FFT的本质是快速计算多项式的点值表示
  • 对负实数的四舍五入需要-0.5
  • 编写函数接收数组地址时,注意不能破坏原数组
  • FFT有较为严重的精度问题,double甚至难以准确计算两个\(10^9\)级别的整数相乘的结果,即使采用long double也时常无法得到准确的答案,这或许也是模板题中保证系数为个位数的原因
  • FFT要求项数严格为2的幂次,因此要多开一些空间
点击查看代码
#include <bits/stdc++.h>
using namespace std;
complex<long double>a[100005],b[100005],tmp[300005],ans[300005];
complex<long double>F[300005],G[300005];
const complex<long double> I(0,1);
const long double pi=acos(-1.0);
long long read1()
{
	char cc=getchar();
	while(!(cc>=48&&cc<=57))
	{
		if(cc=='-')
		{
			break;
		}
		cc=getchar();
	}
	bool f=false;
	long long s=0;
	if(cc=='-')
	{
		f=true;
	}
	else
	{
		s=cc-48;
	}
	while(1)
	{
		cc=getchar();
		if(cc>=48&&cc<=57)
		{
			s=s*10+cc-48;
		}
		else
		{
			break;
		}
	}
	if(f==true)
	{
		s=-s;
	}
	return s;
}
void FFT(complex<long double>*f,long long n,long long opt)
{
	if(n==1)
	{
		return;
	}
	for(long long i=0;i<n;i++)
	{
		tmp[i]=f[i];
	}
	for(long long i=0;i<n;i++)
	{
		if(i%2==0)
		{
			f[i/2]=tmp[i];
		}
		else
		{
			f[i/2+n/2]=tmp[i];
		}
	}
	complex<long double>*g=f,*h=f+n/2;
	FFT(g,n/2,opt);
	FFT(h,n/2,opt);
	complex<long double>cur(1,0),step=exp(I*(2*pi/n*opt));
	for(long long i=0;i<n/2;i++)
	{
		tmp[i]=g[i]+h[i]*cur;
		tmp[i+n/2]=g[i]-h[i]*cur;
		cur*=step;
	}
	for(long long i=0;i<n;i++)
	{
		f[i]=tmp[i];
	}
}
void mul(complex<long double>*f,long long n,complex<long double>*g,long long m,complex<long double>*ans,long long maxn)
{
	/*
	for(long long i=0;i<n;i++)
	{
		for(long long j=0;j<m;j++)
		{
			if(i+j<maxn)
			{
				ans[i+j]+=(f[i]*g[j]);
			}
		}
	}
	*/
	long long tmp=ceil(log(n+m+2)/log(2));
	for(long long i=0;i<(1<<tmp);i++)
	{
		F[i]=0;
		if(i<n)
		{
			F[i]=f[i];
		}
	}
	for(long long i=0;i<(1<<tmp);i++)
	{
		G[i]=0;
		if(i<m)
		{
			G[i]=g[i];
		}
	}
	FFT(F,(1<<tmp),1);
	FFT(G,(1<<tmp),1);
	for(long long i=0;i<(1<<tmp);i++)
	{
		F[i]*=G[i];
	}
	FFT(F,(1<<tmp),-1);
	for(long long i=0;i<maxn;i++)
	{
		ans[i]=F[i].real()/(1<<tmp);
	}
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i<=n;i++)
	{
		a[i]=read1();
	}
	for(int i=0;i<=m;i++)
	{
		b[i]=read1();
	}
	mul(a,n+1,b,m+1,ans,n+m+1);
	for(int i=0;i<n+m+1;i++)
	{
		printf("%lld ",(long long)(ans[i].real()+0.5));
	}
	cout<<endl;
	return 0;
}

标签:opt,复习,cc,double,FFT,long,笔记,300005,傅里叶
From: https://www.cnblogs.com/watersail/p/18292595

相关文章

  • Bullet 学习笔记之 软体仿真流程(二) 软体碰撞检测与响应
    简述Bullet中软体的碰撞检测与响应算法,仅针对Soft类型,Deformable类型不包含在这篇文章中。1.软体碰撞检测在BulletPhysics中,软体的碰撞检测采用的是“点-面”的方法,即分别用两个软体的m_ndbvt和m_fdbvt做碰撞检测,两个bvh树之间的遍历方法不在此展开,当Node......
  • 文案板块:5分钟掌握批量创作100条小红书爆款笔记文案(机器人实操训练)
    引言在数字营销的世界里,内容为王。但如何在短时间内制作出大量高质量的内容,以吸引并保持受众的注意力呢?作为普通人,你要有结果,你除非有非常过人的内容制作能力,不然就是批量化,否则大概率很难有办法突破短时间内的流量爆发。这种搞流量的方法确实也适合小白,因为基本上都是重复......
  • 苹果笔记本能玩网页游戏吗 苹果电脑玩steam游戏怎么样 苹果手机可以玩游戏吗 mac电脑
    苹果笔记本无疑是优秀的“办公助手”,但对于游戏爱好者来说,它的游戏性能如何?首先,我们来讨论苹果笔记本在玩网页游戏方面的表现。一、苹果笔记本能玩网页游戏吗苹果笔记本历代都配备了高分辨率的屏幕和优质的显示技术,这使得苹果笔记本相比于Windows电脑,在视觉体验上有着明显的......
  • clean code-代码整洁之道 阅读笔记(第十七章 终章)
    大纲第十七章味道与启发17.1注释C1:不恰当的信息C2:废弃的注释C3:冗余注释C4:糟糕的注释C5:注释掉的代码17.2环境E1:需要多步才能实现的构建E2:需要多步才能做到的测试17.3函数F1:过多的参数F2:输出参数F3:标识参数F4:死函数17.4一般性问题G1:一个源文件中存在多种语......
  • Living-Dream 系列笔记 第61期
    退役选手复活后的第一篇。https://www.luogu.com.cn/problem/SP4033其实只要一个insert.就是插入时没新建节点\(\to\)自己是别人前缀,插入时途经了别人的结束节点\(\to\)别人是自己前缀。code#include<bits/stdc++.h>usingnamespacestd;constintN=3e5+5,M=31;i......
  • Shell学习笔记
    一、概述Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。Linux提供的Shell解释器[root@VM-12-10-centosshells]#cat/etc/shells/bin/sh/bin/bash/usr/bin/sh/usr/bin/ba......
  • 【狂神说Java】系列学习笔记01——MarkDown语法
    #MarkDown学习本文为B站老师秦疆【狂神说Java】系列,课堂学习笔记,主要联练习的是MarkDown的使用方法,老师的博客链接我没找到,广告1.标题+加粗2级3级4级5级6级最多七级标题Helloworld!Helloworld!Helloworld!Helloworld!引用-沐风6标题一级标题(#+空格)二......
  • C语言学习笔记(02)——关键字概念
    sizeof编译器给我们查看内存空间容量的一个工具不存在函数实现,在任何情况下都可以使用inta:printf("theais%d\n",sizeof(a));printf("theais%lu\n",sizeof(a)); //最好使用%lu打印,因为sizeof默认返回的是unsignedlong类型的>>>4char:硬件处理的最小单位;8bit=1B,8bi......
  • 实训第一天笔记
    图片里是今天学习的主要内容:今天学习了很多东西,有新的命令也有旧的命令,故障也有出现,最后访问到想要的页面了。下面是操作的主要命令操作:  1 rm-rf/etc/yum.repos.d/*  2 vi/etc/yum.repos.d/dd.repo  5 mount-a  8 yum-yinstallbash-co......
  • 7.9,课堂笔记
    1.ifconfig查看IP地址(要切换为超级用户)例如:192.168.100.128ip地址2、serviceiptablesstop关闭防火墙(要连接Xshell,要关闭防火墙)serviceiptablesstart开启防火墙serviceiptablesrestart重启防火墙serviceiptablesstatus查看防火......