【UOJ】【34】多项式乘法
快速傅里叶变换模板题
算法理解请看《算法导论》第30章《多项式与快速傅里叶变换》,至于证明插值唯一性什么的看不懂也没关系啦~只要明白这个过程是怎么算的就ok。
递归版:(4252ms 23468kb)
//UOJ 34 递归版
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<complex>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
const int N=;
void read(int &v){
v=;int sign=; char ch=getchar();
while(ch<'' || ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){v=v*+ch-''; ch=getchar();}
v*=sign;
}
/****************tamplate***********************/
const double PI=acos(-);
typedef complex<double> comp;
comp a[N],b[N],c[N];
void FFT(comp a[],int n,int type){
if (n==) return;
int i;
comp y0[n>>],y1[n>>];
for(int i=;i<n;i+=)
y0[i>>]=a[i],y1[i>>]=a[i+];
FFT(y0,n>>,type); FFT(y1,n>>,type);
comp w0( cos(type**PI/n) , sin(type**PI/n) ), w(,);
for(i=;i<(n>>);i++,w*=w0)
a[i]=y0[i]+w*y1[i],a[i+(n>>)]=y0[i]-w*y1[i];
}
int main(){
int i,temp,n,m;
read(n); read(m);
int x;
F(i,,n) read(x),a[i].real()=x;
F(i,,m) read(x),b[i].real()=x;
for(temp=;temp<=m+n;temp<<=);
FFT(a,temp,); FFT(b,temp,);
rep(i,temp) c[i]=a[i]*b[i];
FFT(c,temp,-);
for(int i=;i<=m+n;++i)
printf("%d ",int(c[i].real()/temp+0.5));
puts("");
return ;
}
迭代版:(1228ms 48088kb)(空间浪费了,其实用不了这么大)
//UOJ 34 迭代版
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<complex>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std;
const int N=;
void read(int &v){
v=;int sign=; char ch=getchar();
while(ch<'' || ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){v=v*+ch-''; ch=getchar();}
v*=sign;
}
/****************tamplate***********************/
const double pi=acos(-);
typedef complex<double> comp;
comp a[N],b[N],c[N];
int n,m;
void FFT(comp *a,int n,int type){
for(int i=,j=;i<n-;i++){//j初始为i-1的位逆序置换?……每次算出i的位逆序置换j,下一次从j开始找(二进制加法)
//只改变1~n-2,0和n-1位置不变
for(int s=n;j^=s>>=,~j&s;);//
if (i<j) swap(a[i],a[j]);
}
for(int m=;m<n;m<<=){
double u=pi/m*type; comp wm(cos(u),sin(u));
for(int k=;k<n;k+=(m<<) ){
comp w(,);
for(int j=;j<m;j++){
comp &A=a[k+j+m],&B=a[k+j],t=w*A;
A=B-t; B=B+t; w=w*wm;
}
}
}
if (type==-) rep(i,n) a[i].real()/=n;
} int main(){
#ifndef ONLINE_JUDGE
freopen("FFT.in","r",stdin);
#endif
read(n); read(m);
int k=;
for(k=;k<=n||k<=m;k<<=); k<<=;
int x;
F(i,,n) read(x),a[i].real()=x;
F(i,,m) read(x),b[i].real()=x;
FFT(a,k,); FFT(b,k,);
rep(i,k) c[i]=a[i]*b[i];
FFT(c,k,-);
F(i,,n+m) printf("%d ",int(c[i].real()+0.5));
return ;
}
位逆序置换:(orz trz爷)(27~30行)
TRZ:比如我们要把一个二进制数加一,不是从最低位开始找到一个0,把它变成1,它之后的都变0嘛?那么现在我们有了i的位逆序表示,要求i+1的,不就是从最高位找0嘛,那个循环就是干这个事的。
【UOJ】【34】多项式乘法的更多相关文章
- [UOJ#34]多项式乘法
[UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...
- ●UOJ 34 多项式乘法
题链: http://uoj.ac/problem/34 题解: FFT入门题. (终于接触到迷一样的FFT了) 初学者在对复数和单位根有简单了解的基础上,可以直接看<再探快速傅里叶变换> ...
- UOJ#34. 多项式乘法(NTT)
这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项 ...
- 【刷题】UOJ #34 多项式乘法
这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 \(n\) 和 \(m\) ,分别表示两个多项式的次数. 第二行 \(n+1\) 个整数,表示第一个多项式的 \( ...
- UOJ 34 多项式乘法 FFT 模板
这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项 ...
- 2018.11.14 uoj#34. 多项式乘法(ntt)
传送门 今天学习nttnttntt. 其实递归方法和fftfftfft是完全相同的. 只不过fftfftfft的单位根用的是复数中的东西,而nttnttntt用的是数论里面有相同性质的原根. 代码: ...
- 2018.11.14 uoj#34. 多项式乘法(fft)
传送门 NOIpNOIpNOIp爆炸不能阻止我搞oioioi的决心 信息技术课进行一点康复训练. fftfftfft板题. 代码: #include<bits/stdc++.h> usin ...
- UOJ 34 多项式乘法 ——NTT
[题目分析] 快速数论变换的模板题目. 与fft的方法类似,只是把复数域中的具有循环性质的单位复数根换成了模意义下的原根. 然后和fft一样写就好了,没有精度误差,但是跑起来比较慢. 这破题目改了好长 ...
- UOJ 34: 多项式乘法(FFT模板题)
关于FFT 这个博客的讲解超级棒 http://blog.miskcoo.com/2015/04/polynomial-multiplication-and-fast-fourier-transfor ...
- [UOJ 0034] 多项式乘法
#34. 多项式乘法 统计 描述 提交 自定义测试 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+ ...
随机推荐
- 百度编辑器ueditor代码高亮效果前台不显示的解决方法
原因是你没有在你的内容页加载相应的css文件,这要如何解决呢? 经测试,只要插入以下两个文件即可解决问题: <link href="你的ueditor路径/ueditor/third- ...
- .net上传图片并转成二进制流
话不多说,直接上代码 <input id="InputFile" style="width: 399px" type="file" r ...
- Cocos2d-x移植到WindowsPhone8移植问题-框架rapidjson移植问题
Cocos2d-x 3.0提供了JSON框架rapidjson可以在Windows Phone 8平台使用,如果没有进行必要的配置,在编译的时候会报错,document.h等头文件找不到的错误.在Wi ...
- 转: 理解Python的With语句
Python’s with statement provides a very convenient way of dealing with the situation where you have ...
- startup.bat闪退---tomcat环境变量配置中遇到的问题
常用的方法: 1.在已解压的tomcat的bin文件夹下找到startup.bat,右击->编辑.在文件头加入下面两行: SET JAVA_HOME=D:\Java\jdk1.6.0_10 ...
- 解决grub引导错误的一次经历
我的电脑上一共是两块硬盘,1块固态硬盘(sda)装了win7,另外一块普通硬盘(sdb)装了ubuntu和centos两个系统,系统启动的引导是装在sdb上面的ubuntu的grub2,它负责选择不同 ...
- MYSQL IN 与 EXISTS 的优化示例
文章转载自:http://www.jb51.net/article/53127.htm 当B表的数据集必须小于A表的数据集时,用in优于exists,当A表的数据集系小于B表的数据集时,用exists ...
- SQL server数据库内置账户SA登录设置
SQL server数据库内置账户SA登录不了 设置SQL Server数据库给sa设置密码的时候 提示18456 解决步骤: 第二步:右击sa,选择属性: 第三步:点击状态选项卡:勾选授予 ...
- 【Qt】Qt Assistant介绍【转】
简介 Qt Assistant也就是我们常说的Qt助手,是一款用于呈现在线文档的工具. 简介 一分钟学会使用 Qt参考文档 Qt Assistant详解 命令行选项 工具窗口 文档窗口 工具栏 菜单 ...
- 如何通过jquery隐藏和显示元素
以下几种方式可以隐藏一个元素:1,CSS display的值是none.2,type="hidden"的表单元素.3,宽度和高度都显式设置为0.4,一个祖先元素是隐藏的,该元素是不 ...