洛谷.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_ ...
随机推荐
- SSD win7优化步骤
随着固态硬盘价格不断下降,目前固态硬盘也得到了广泛了应用,一些新笔记本以及组装电脑也开始普遍采用固态硬盘平台,超级本就更不用说了,采用固态硬盘已经成标配化,虽然固态硬盘速度很快,但不懂的优化,依然无法 ...
- STM32F103X datasheet学习笔记---Flexible static memory controller (FSMC)
1.前言 FSMC模块能够与同步或异步存储器和16位PC存储器卡接口,它的主要作用是: 将AHB传输信号转换到适当的外部设备协议 满足访问外部设备的时序要求 所有的外部存储器共享控制器输出的地址.数据 ...
- David McCullough, Jr.为韦斯利高中毕业生演讲〈你并不特别〉
Dr. Wong, Dr. Keough, Mrs.Novogroski, Ms. Curran, members of the board of education, familyand frien ...
- linux 查看cpu的使用百分比
先安装 sudo apt-get install sysstat 然后: mpstat -u 2 5
- jrockit静默安装笔记
操作系统安装版本:CentOS-6.4-i386-minimal JDK安装版本:jrockit-jdk1.6.0_20-R28.1.0-4.0.1-linux-ia32 1.通过SecureFX工具 ...
- SharePoint 2010:“&”作为SharePoint账号密码引起的错误
一朋友修改了SharePoint 2010系统账号密码,导致无法登陆.他的环境如下: 两台服务器:AD+SharePoint 2010 ,Sql Server 2008 r2 目标站点开启了Form登 ...
- 016_nginx运维问题总结
一.关于nginx请求包过大的解决思路 message-api.jyall.me.conf nginx报错问题问题定位,经分析跟接入navigator后关联不大,可参考一下结论连接超时抓包分析了一下每 ...
- 使用NGINX+Openresty和unixhot_waf开源防火墙实现WAF功能
使用NGINX+Openresty实现WAF功能 一.了解WAF1.1 什么是WAF Web应用防护系统(也称:网站应用级入侵防御系统 .英文:Web Application Firewall,简称: ...
- .netcore 整合 log4net
1.背景 前两天,曾经的一个同事咨询我,怎样将log4net以中间件的形式整合到core里边去.我不假思索的回答,这种问题应该有人做过吧,他说没有.于是,我去博客园搜了下,发现还真没有,全部都是传统. ...
- 解决Android SDK下载和更新失败问题
今天更新sdk报错如下: Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.xml. 说dl- ...