FFT 入门

推荐博客 : https://oi.men.ci/fft-notes/

卷积的理解 : https://www.zhihu.com/question/22298352?rf=21686447

 

题目链接 :http://uoj.ac/problem/34

 

这是一道模板题。

给你两个多项式,请输出乘起来后的多项式。
输入格式

第一行两个整数 nn 和 mm,分别表示两个多项式的次数。

第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项系数。

第三行 m+1m+1 个整数,表示第二个多项式的 00 到 mm 次项系数。
输出格式

一行 n+m+1n+m+1 个整数,表示乘起来后的多项式的 00 到 n+mn+m 次项系数。
样例一
input

1 2
1 2
1 2 1

output

1 4 5 2

explanation

(1+2x)?(1+2x+x2)=1+4x+5x2+2x3(1+2x)?(1+2x+x2)=1+4x+5x2+2x3。
限制与约定

0≤n,m≤105,保证输入中的系数大于等于 0 且小于等于 9。

时间限制:1s1s

空间限制:256MB

 

题意  :  给你两个多项式的系数,从 0 到 n 给出,求这两个多项式相乘后的系数,从小到大输出

思路分析 : 裸的 FFT ,参考kuangbin 的板子

    就是要注意以下数组的大小,main中的 len 是 2^k , 因此当m+n = 2e5 左右时,此时 2^k = 260000+ , 因此要注意数组的大小

代码示例:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5+63000;
const double pi = acos(-1.0);
int n, m;
struct Complex{double x, y;Complex (double _x=0, double _y=0):x(_x), y(_y){}Complex operator -(const Complex &b)const{return Complex(x-b.x, y-b.y);}Complex operator +(const Complex &b)const{return Complex(x+b.x, y+b.y);}Complex operator *(const Complex &b)const{return Complex(x*b.x-y*b.y, x*b.y+y*b.x);}
};Complex x1[maxn], x2[maxn];
int sum[maxn];
void change(Complex y[], int len){for(int i = 1, j = len/2; i < len-1; i++){if (i < j) swap(y[i], y[j]);int k = len/2;while(j >= k){j -= k;k /= 2;}if (j < k) j += k;}
}void fft(Complex y[], int len, int on){change(y, len);for(int h = 2; h <= len; h <<= 1){Complex wn(cos(-on*2*pi/h), sin(-on*2*pi/h));for(int j = 0; j < len; j += h){Complex w(1, 0);for(int k = j; k < j+h/2; k++){Complex u = y[k];Complex t = w*y[k+h/2];y[k] = u+t;y[k+h/2] = u-t;w = w*wn;}}}if (on == -1){for(int i = 0; i < len; i++)y[i].x /= len;}
}int main () {cin >> n >> m;int len = 1;while(len <= (n+m)) len <<= 1;for(int i = 0; i <= n; i++) scanf("%lf", &x1[i].x);fft(x1, len, 1);for(int i = 0; i <= m; i++) scanf("%lf", &x2[i].x);fft(x2, len, 1);for(int i = 0; i < len; i++)x1[i] = x1[i]*x2[i];fft(x1, len, -1);for(int i = 0; i <= n+m; i++){sum[i] = (int)(x1[i].x+0.5); // sum[] 是最后的答案 printf("%d%c", sum[i], i ==n+m?'\n':' ');}return 0;
}

 

____________________________________________________________________________

int rev[maxl];
void get_rev(int bit)//bit表示二进制位数,计算一个数在二进制翻转之后形成的新数
{for(int i=0;i<(1<<bit);i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
}
void fft(cd *a,int n,int dft)//n表示我的多项式位数
{for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);//中间的那个if保证了每个数做多只被交换了1次//如果不写那么会有一些数被交换两次,导致最终的位置没有变for(int step=1;step<n;step<<=1)//模拟一个合并的过程{cd wn=exp(cd(0,dft*PI/step));//计算当前单位复根for(int j=0;j<n;j+=step<<1){cd wnk(1,0);//计算当前单位复根for(int k=j;k<j+step;k++){//蝴蝶操作cd x=a[k];cd y=wnk*a[k+step];a[k]=x+y;//这就是上文中F(x)=G(x)+ωH(x)的体现a[k+step]=x-y;//后半个“step”中的ω一定和“前半个”中的成相反数//“红圈”上的点转一整圈“转回来”,转半圈正好转成相反数//一个数相反数的平方与这个数自身的平方相等..wnk*=wn;}}}if(dft==-1) for(int i=0;i<n;i++) a[i]/=n;//考虑到如果是IDFT操作,整个矩阵中的内容还要乘上1/n  
}

 

转载于:https://www.cnblogs.com/ccut-ry/p/9498240.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MPEG4视频压缩编码技术详解

MPEG全称是Moving Pictures Experts Group&#xff0c;它是“动态图象专家组”的英文缩写&#xff0c;该专家组成立于1988年&#xff0c;致力于运动图像及其伴音的压缩编码标准化工作&#xff0c;原先他们打算开发MPEG1、MPEG2、MPEG3和MPEG4四个版本&#xff0c;以适用于不同带…

oracle orion hugepages_settings.sh(支持OEL 7,4.1内核)

orion需要首先配置hugepage&#xff0c;否则会出现下列错误。[rootyyxxdb01 ~]# /opt/app/11.2.0/grid_home/bin/orion -run oltp -testname mytestORION: ORacle IO Numbers -- Version 11.2.0.4.0************************ Large Pages Information *******************Param…

eclipse启动出现“An Error has Occurred. See the log file”解决方法

见&#xff1a;http://blog.csdn.net/ww130929/article/details/52652222 这段时间开发java的项目&#xff0c;刚开始启动Eclipse的时候经常遇到这个问题&#xff0c;写这篇博客来记录解决方法。 1.删除工程目录下的&#xff1a; “.metadata/.plugins/org.eclipse.core.resour…

初识NIO之Java小Demo

Java中的IO、NIO、AIO&#xff1a; BIO&#xff1a;在Java1.4之前&#xff0c;我们建立网络连接均使用BIO&#xff0c;属于同步阻塞IO。默认情况下&#xff0c;当有一条请求接入就有一条线程专门接待。所以&#xff0c;在客户端向服务端请求时&#xff0c;会询问是否有空闲线程…

RTP协议详解

RTP协议分析 第1章. RTP概述 1.1. RTP是什么 RTP全名是Real-time Transport Protocol&#xff08;实时传输协议&#xff09;。它是IETF提出的一个标准&#xff0c;对应的RFC文档为RFC3550&#xff08;RFC1889为其过期版本&#xff09;。RFC3550不仅定义了RTP&#xff0…

线程状态转换

一、线程状态转换 新建&#xff08;New&#xff09; 创建后尚未启动。 可运行&#xff08;Runnable&#xff09; 可能正在运行&#xff0c;也可能正在等待 CPU 时间片。 包含了操作系统线程状态中的 Running 和 Ready。 阻塞&#xff08;Blocking&#xff09; 等待获取一个排它…

Eclipse中启动tomcat报错java.lang.OutOfMemoryError: PermGen space的解决方法

见&#xff1a;http://outofmemory.cn/java/OutOfMemoryError/outofmemoryerror-permgen-space-in-tomcat-with-eclipse 有的项目引用了太多的jar包&#xff0c;或者反射生成了太多的类&#xff0c;异或有太多的常量池&#xff0c;就有可能会报java.lang.OutOfMemoryError: Per…

MPEG-4 AVC/H.264 信息

作者&#xff1a;haibara 来源&#xff1a;pcicp.com 本FAQ由&#xff08;haibara&#xff09;翻译&#xff0c;期间受到kaito_mkid&#xff08;pcicp&#xff09;帮助&#xff0c;在此感谢&#xff0c;由于Newbie的关系&#xff0c;如有翻译错误&#xff0c;还请各位指出&…

eclipse搜索关键字

见&#xff1a;https://jingyan.baidu.com/article/e6c8503c1a60d2e54f1a18e3.html

装饰器语法糖运用

装饰器语法糖运用 前言&#xff1a;函数名是一个特性的变量&#xff0c;可以作为容器的元素&#xff0c;也可以作为函数的参数&#xff0c;也可以当做返回值。闭包定义&#xff1a; 内层函数对外层函数&#xff08;非全局&#xff09;变量的引用&#xff0c;这个内层函数就可以…

fb 4.7英文版 显示行数

窗口&#xff08;window&#xff09;首选项&#xff08;Preference&#xff09;—>常规&#xff08;General&#xff09;—>编辑器&#xff08;Editors&#xff09;—>文本编辑器&#xff08;Text Editors&#xff09;—>“显示行号”&#xff08;Show line number…

集市中迷失的一代:FreeBSD核心开发者反思开源软件质量

摘要&#xff1a;本文作者Poul-Henning Kamp (phkFreeBSD.org) &#xff0c;26年的计算机程序员&#xff0c;他编写的软件以底层构建块的形式广泛被开源和商业产品采用。讲述作者在看完《设计原本》这本书后所引发的共鸣&#xff01; 13年前&#xff0c;新兴的草根开源软件运动…

点击表格弹窗获取另外一套数据之后,原表格相关数据的调用

用H5新属性&#xff0c;data-*&#xff0c; $获取方式&#xff1a; 待续。。。。。。。 转载于:https://www.cnblogs.com/He-tao-yuan/p/9888316.html

谷歌浏览器如何如何禁用弹出窗口阻止程序

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在工具栏上使用 Google Chrome 菜单。工具栏上的菜单位于浏览器右上角。 选择“设置”。 在页面底端找到并点击“显示高级设置”。 在“隐…

Python 3 入门,看这篇就够了

文章目录 简介基础语法运算符变量数据类型流程控制迭代器生成器函数 自定义函数参数传递 可更改与不可更改对象参数匿名函数变量作用域模块面向对象错误和异常文件操作序列化命名规范参考资料简介 Python 是一种高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Pyt…

面试经历(二)

前面说到用数据库中的锁机制对并发事务进行控制&#xff0c;这节来说说事务方法和事务方法发生嵌套调用时事务如何进行传播。例如&#xff1a;方法可能继续在现有事务中运行&#xff0c;也可能开启一个新事务&#xff0c;并在自己的事务中运行。例如&#xff1a;方法可能继续在…

最有价值的编程忠告

摘要&#xff1a;本文是来自贝尔实验室Plan 9操作系统的创始人Rob Pike给大家分享的编程忠告&#xff01;Rob Pike&#xff0c;目前谷歌公司最著名的软件工程师之一&#xff0c;曾是贝尔实验室Unix开发团队成员&#xff0c;缔造Go语言和Limbo语言的核心人物。 Rob Pike&#xf…

Column count doesn't match value count at row 1 原因

mysql 提示 &#xff1a; Column count doesnt match value count at row 1错误&#xff0c;SQL语句中列的个数和值的个数不等&#xff0c; 如&#xff1a; insert into table1 (field1,field2) values(值1&#xff0c;值2&#xff0c;值3 ) 列只有2个&#xff0c;值 却有3个…

MarkDowm快捷键大全

文章目录一&#xff1a;菜单栏二&#xff1a;文件三&#xff1a;编辑四&#xff1a;段落五&#xff1a;格式六&#xff1a;视图一&#xff1a;菜单栏 文件&#xff1a;altF 编辑&#xff1a;altE 段落&#xff1a;altP 格式&#xff1a;altO 视图&#xff1a;altV 主题&#x…

Kinect2.0-空间长度测量

1. 鼠标左键按下选择起点&#xff0c;拖动鼠标&#xff0c;左键放开&#xff0c;确定终点。 实现效果1实现效果22. 在linux下使用libfreenect2开源多平台驱动来获取kinect2.0的传感器信息&#xff0c;得到深度信息&#xff0c;并通过libfreenect2提供的getPointXYZ函数&#xf…