洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷、LOJ.
FFT相关:快速傅里叶变换(FFT)详解、FFT总结、从多项式乘法到快速傅里叶变换.
5.4 又看了一遍,这个也不错。
2019.3.7 叕看了一遍,推荐这个。
#include <cmath>
#include <cctype>
#include <cstdio>
#include <algorithm>
#define gc() getchar()
const int N=1e6+5;
const double PI=acos(-1);
int n,m;
struct Complex
{
double x,y;
Complex(double xx=0,double yy=0) {x=xx, y=yy;}
Complex operator + (const Complex &a) {return Complex(x+a.x, y+a.y);}
Complex operator - (const Complex &a) {return Complex(x-a.x, y-a.y);}
Complex operator * (const Complex &a) {return Complex(x*a.x-y*a.y, x*a.y+y*a.x);}
}A[N*3],B[N*3];//size!
void Fast_Fourier_Transform(Complex *a,int lim,int opt)
{
for(int j=0,i=0; i<lim; ++i)
{
if(i>j) std::swap(a[i],a[j]);
for(int l=lim>>1; (j^=l)<l; l>>=1);
}
for(int i=2; i<=lim; i<<=1)//最后等于lim即整个序列的合并
{
int mid=i>>1;
Complex Wn(cos(2.0*PI/i),opt*sin(2.0*PI/i)),t;
for(int j=0; j<lim; j+=i)
{
Complex w(1,0);
for(int k=0; k<mid; ++k,w=w*Wn)
a[j+mid+k]=a[j+k]-(t=w*a[j+mid+k]),
a[j+k]=a[j+k]+t;
}
}
}
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
int main()
{
n=read(),m=read();
for(int i=0; i<=n; ++i) A[i].x=(double)read();//scanf("%lf",&A[i].x);
for(int i=0; i<=m; ++i) B[i].x=(double)read();//scanf("%lf",&B[i].x);
int lim=1;
while(lim<=n+m) lim<<=1;
Fast_Fourier_Transform(A,lim,1);
Fast_Fourier_Transform(B,lim,1);
for(int i=0; i<=lim; ++i) A[i]=A[i]*B[i];//size!
Fast_Fourier_Transform(A,lim,-1);
for(int i=0; i<=n+m; ++i) printf("%d ",(int)(A[i].x/lim+0.5));
return 0;
}
递归实现:
#include <cmath>
#include <cstdio>
#include <cctype>
#include <cstdlib>
#define gc() getchar()
const int N=2e6+5;
const double PI=acos(-1.0);
int n,m;
struct Complex
{
double x,y;
Complex(double xx=0,double yy=0) {x=xx, y=yy;}
Complex operator + (const Complex &a) {return Complex(x+a.x, y+a.y);}
Complex operator - (const Complex &a) {return Complex(x-a.x, y-a.y);}
Complex operator * (const Complex &a) {return Complex(x*a.x-y*a.y, x*a.y+y*a.x);}
}A[N],B[N];
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
void Fast_Fourier_Transform(Complex *a,int lim,int type)
{
if(lim==1) return;
Complex a1[lim>>1],a2[lim>>1];//爆栈
for(int i=0; i<lim; i+=2)
a1[i>>1]=a[i], a2[i>>1]=a[i+1];
Fast_Fourier_Transform(a1,lim>>1,type),
Fast_Fourier_Transform(a2,lim>>1,type);
Complex Wn(cos(2.0*PI/lim),type*sin(2.0*PI/lim)),w(1,0),t;//Wn:单位根 w:幂
for(int i=0; i<(lim>>1); ++i,w=w*Wn)
a[i]=a1[i]+(t=w*a2[i]),
a[i+(lim>>1)]=a1[i]-t;
}
int main()
{
n=read(),m=read();
for(int i=0; i<=n; ++i) A[i].x=read();
for(int i=0; i<=m; ++i) B[i].x=read();
int lim=1;
while(lim<=n+m) lim<<=1;
Fast_Fourier_Transform(A,lim,1);
Fast_Fourier_Transform(B,lim,1);
for(int i=0; i<=lim; ++i) A[i]=A[i]*B[i];
Fast_Fourier_Transform(A,lim,-1);
for(int i=0; i<=n+m; ++i) printf("%d ",(int)(A[i].x/lim+0.5));
return 0;
}
洛谷.3803.[模板]多项式乘法(FFT)的更多相关文章
- 洛谷.3803.[模板]多项式乘法(NTT)
题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...
- 洛谷.4512.[模板]多项式除法(NTT)
题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...
- 洛谷.4238.[模板]多项式求逆(NTT)
题目链接 设多项式\(f(x)\)在模\(x^n\)下的逆元为\(g(x)\) \[f(x)g(x)\equiv 1\ (mod\ x^n)\] \[f(x)g(x)-1\equiv 0\ (mod\ ...
- P3803 [模板] 多项式乘法 (FFT)
Rt 注意len要为2的幂 #include <bits/stdc++.h> using namespace std; const double PI = acos(-1.0); inli ...
- 洛谷 P4512 [模板] 多项式除法
题目:https://www.luogu.org/problemnew/show/P4512 看博客:https://www.cnblogs.com/owenyu/p/6724611.html htt ...
- 洛谷 P4238 [模板] 多项式求逆
题目:https://www.luogu.org/problemnew/show/P4238 看博客:https://www.cnblogs.com/xiefengze1/p/9107752.html ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 多项式乘法(FFT)学习笔记
------------------------------------------本文只探讨多项式乘法(FFT)在信息学中的应用如有错误或不明欢迎指出或提问,在此不胜感激 多项式 1.系数表示法 ...
- [uoj#34] [洛谷P3803] 多项式乘法(FFT)
新技能--FFT. 可在 \(O(nlogn)\) 时间内完成多项式在系数表达与点值表达之间的转换. 其中最关键的一点便为单位复数根,有神奇的折半性质. 多项式乘法(即为卷积)的常见形式: \[ C_ ...
随机推荐
- gamma校正
1 gamma校正背景 在电视和图形监视器中,显像管发生的电子束及其生成的图像亮度并不是随显像管的输入电压线性变化,电子流与输入电压相比是按照指数曲线变化的,输入电压的指数要大于电子束的指数.这说明暗 ...
- aiohttp分流处理
# -*- coding: utf-8 -*- # @Time : 2018/12/26 9:55 PM # @Author : cxa # @Software: PyCharm import asy ...
- 【转】深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
这篇博文,我们使用ActiveMQ为大家实现一种点对点的消息模型.如果你对点对点模型的认识较浅,可以看一下第一篇博文的介绍. JMS其实并没有想象的那么高大上,看完这篇博文之后,你就知道什么叫简单,下 ...
- eclipse自动添加注释
自动添加注释 快捷键:alt shift jwindows-->preference Java-->Code Style-->Code Templates code-->new ...
- 安装installshield问题
install designer中 general information 选择setup languages shortcuts编辑 开始 中显示目录 文件路径 C:\Program Files ...
- windows系统实现mysql数据库数据库主从复制
环境: master mysql服务器 192.168.8.201 slave mysql服务器 192.168.8.89 目标: 实现主从复制 1.将MySQL5.5安装文件分别拷贝到两台机器的c盘 ...
- 为cobbler自动化安装系统工具添加epel源
关于cobbler的安装及部署,参考:CentOS 6.5自动化运维之基于cobbler服务的自动化安装操作系统详解http://blog.csdn.net/reblue520/article/det ...
- Go语言规格说明书 之 通道类型(Channel types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- 中文汉字和常见英文数字等的unicode编码范围实例页面
链接: https://www.zhangxinxu.com/study/201611/chinese-language-unicode-range.html
- java多线程快速入门(十)
synchonizd解决安全性问题 package com.cppdy; class MyThread6 implements Runnable{ private Integer ticketCoun ...