FFT多项式乘法加速
FFT基本操作。。。讲解请自己看大学信号转置系列。。。
15-5-30更新:改成结构体的,跪烂王学长啊啊啊啊机智的static。。。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
#pragma comment(linker,"/STACK:10240000,10240000")
using namespace std;
const double PI=acos(-1.0);
const int maxn=+;
struct FFT{
struct cox{
double r,i;cox(double _r = 0.0,double _i = 0.0){r=_r;i=_i;}
cox operator +(const cox &b){return cox(r+b.r,i+b.i);}
cox operator -(const cox &b){return cox(r-b.r,i-b.i);}
cox operator *(const cox &b){return cox(r*b.r-i*b.i,r*b.i+i*b.r);}
}f[maxn];int len,lenx;
void init(int*s,int L,int Len){
len=L;lenx=Len;
for(int i=;i<L;i++) f[i]=cox(s[L--i],);
for(int i=L;i<Len;i++) f[i]=cox(,);return;
}
void change(){
for(int i=,j=lenx>>;i<lenx-;i++){
if(i<j)swap(f[i],f[j]);
int k=lenx>>;
while(j>=k) j-=k,k>>=;
if(j<k) j+=k;
} return;
}
void cal(int tp){
change();
for(int h=;h<=lenx;h<<=){
double tr=-tp**PI/h;
cox wn(cos(tr),sin(tr));
for(int j=;j<lenx;j+=h){
cox w(,);
for(int k=j;k<j+(h>>);k++){
cox u=f[k],t=w*f[k+(h>>)];
f[k]=u+t;f[k+(h>>)]=u-t;w=w*wn;
}
}
} if(tp==-) for(int i=;i<lenx;i++) f[i].r/=lenx;return;
}
};
void mul(int*s1,int*s2,int L1,int L2,int&L,int*ans){
L=;while(L<L1<<||L<L2<<) L<<=;
static FFT a,b;a.init(s1,L1,L);b.init(s2,L2,L);a.cal();b.cal();
for(int i=;i<L;i++) a.f[i]=a.f[i]*b.f[i];a.cal(-);
for(int i=;i<L;i++) ans[i]=(int){a.f[i].r+0.5};return;
}
int s1[maxn>>],s2[maxn>>],ans[maxn],L1,L2,L;
void init(){
char ch;int tot;
do ch=getchar(); while(!isdigit(ch));tot=;
while(isdigit(ch)){s1[tot++]=ch-'';ch=getchar();}L1=tot;
do ch=getchar(); while(!isdigit(ch));tot=;
while(isdigit(ch)){s2[tot++]=ch-'';ch=getchar();}L2=tot;
mul(s1,s2,L1,L2,L,ans);
return;
}
void work(){
for(int i=;i<L;i++){
ans[i+]+=ans[i]/;ans[i]%=;
} L=L1+L2-;return;
}
void print(){
while(ans[L]<=&&L>) L--;
for(int i=L;i>=;i--) putchar(ans[i]+'');
return;
}
int main(){init();work();print();return ;}
原来写的丑哭了TAT
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const double PI=acos(-1.0);
struct complex{
double r,i;
complex(double _r = 0.0,double _i = 0.0){r=_r;i=_i;}
complex operator +(const complex &b){return complex(r+b.r,i+b.i);}
complex operator -(const complex &b){return complex(r-b.r,i-b.i);}
complex operator *(const complex &b){return complex(r*b.r-i*b.i,r*b.i+i*b.r);}
};
void change(complex y[],int len){
int i,j,k;
for(i=,j=len/;i<len-;i++){
if(i<j)swap(y[i],y[j]);
k=len/;
while(j>=k) j-=k,k/=;
if(j<k) j+=k;
} return;
}
void fft(complex y[],int len,int on){
change(y,len);
for(int h=;h<=len;h<<=){
complex wn(cos(-on**PI/h),sin(-on**PI/h));
for(int j=;j<len;j+=h){
complex w(,);
for(int k=j;k<j+h/;k++){
complex u=y[k],t=w*y[k+h/];
y[k]=u+t;
y[k+h/]=u-t;
w=w*wn;
}
}
}
if(on==-) for(int i=;i<len;i++) y[i].r/=len;
return;
}
const int MAXN=+;
complex x1[MAXN],x2[MAXN];
char str1[MAXN>>],str2[MAXN>>];
int sum[MAXN];
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
while(isdigit(ch))x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
int len,len1,len2;
void init(){
scanf("%s%s",str1,str2);
len1=strlen(str1),len2=strlen(str2),len=;
return;
}
void work(){
while(len<len1<<||len<len2<<) len<<=;
for(int i=;i<len1;i++) x1[i]=complex(str1[len1--i]-'',);
for(int i=len1;i<len;i++) x1[i]=complex(,);
for(int i=;i<len2;i++) x2[i]=complex(str2[len2--i]-'',);
for(int i=len2;i<len;i++) x2[i]=complex(,);
fft(x1,len,);fft(x2,len,);
for(int i=;i<len;i++) x1[i]=x1[i]*x2[i];
fft(x1,len,-);
for(int i=;i<len;i++) sum[i]=(int)(x1[i].r+0.5);
for(int i=;i<len;i++){
sum[i+]+=sum[i]/;
sum[i]%=;
} len=len1+len2-;return;
}
void print(){
while(sum[len]<=&&len>) len--;
for(int i=len;i>=;i--) putchar(sum[i]+'');
return;
}
int main(){init();work();print();return ;}
搜索
复制
FFT多项式乘法加速的更多相关文章
- FFT多项式乘法模板
有时间来补算法原理orz #include <iostream> #include <cstdio> #include <cmath> #include <c ...
- [笔记]ACM笔记 - 利用FFT求卷积(求多项式乘法)
卷积 给定向量:, 向量和: 数量积(内积.点积): 卷积:,其中 例如: 卷积的最典型的应用就是多项式乘法(多项式乘法就是求卷积).以下就用多项式乘法来描述.举例卷积与DFT. 关于多项式 对于多项 ...
- FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)
前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...
- 【Learning】多项式乘法与快速傅里叶变换(FFT)
简介: FFT主要运用于快速卷积,其中一个例子就是如何将两个多项式相乘,或者高精度乘高精度的操作. 显然暴搞是$O(n^2)$的复杂度,然而FFT可以将其将为$O(n lg n)$. 这看起来十分玄学 ...
- 【总结】对FFT的理解 / 【洛谷 P3803】 【模板】多项式乘法(FFT)
题目链接 \(\Huge\text{无图,慎入}\) \(FFT\)即快速傅里叶变换,用于加速多项式乘法. 如果暴力做卷积的话就是一个多项式的每个单项式去乘另一个多项式然后加起来,时间复杂度为\(O( ...
- UVALive - 6886 Golf Bot 多项式乘法(FFT)
题目链接: http://acm.hust.edu.cn/vjudge/problem/129724 Golf Bot Time Limit: 15000MS 题意 给你n个数,m个查询,对于每个查询 ...
- FFT模板(多项式乘法)
FFT模板(多项式乘法) 标签: FFT 扯淡 一晚上都用来捣鼓这个东西了...... 这里贴一位神犇的博客,我认为讲的比较清楚了.(刚好适合我这种复数都没学的) http://blog.csdn.n ...
- 【Uoj34】多项式乘法(NTT,FFT)
[Uoj34]多项式乘法(NTT,FFT) 题面 uoj 题解 首先多项式乘法用\(FFT\)是一个很久很久以前就写过的东西 直接贴一下代码吧.. #include<iostream> # ...
- 【learning】多项式乘法&fft
[吐槽] 以前一直觉得这个东西十分高端完全不会qwq 但是向lyy.yxq.yww.dtz等dalao们学习之后发现这个东西的代码实现其实极其简洁 于是趁着还没有忘记赶紧来写一篇博 (说起来这篇东西的 ...
随机推荐
- Firemonkey的旁门左道[五]
这次讲讲绘制的几种模式吧,不过还是比较浅显,刚接触不久,还实在没这个实力道出个所以来. FMX下,我们可以切换GDI,D2D,GPU这三种模式, 只要通过全局变量就可以轻松搞定. 如何设置 Globa ...
- 使用Dreamwaver cc中的SVN功能,用于传输BAE和SAE中的文件
前沿: 假期使用BAE和SAE开发应用,两个服务器都需要通过SVN提交代码,因为平时大多使用Dreamwaver,所以查了查资料,通过Subversion方便了开发. 因为网上的资料都不全,所以根据自 ...
- pat 1062. Talent and Virtue (25)
难得的一次ac 题目意思直接,方法就是对virtue talent得分进行判断其归属类型,用0 1 2 3 4 表示 不合格 sage noblemen foolmen foolmen 再对序列进行排 ...
- .net邮件发送实例 邮件内容为网页模板
.net邮件发送实例 邮件内容为网页模板 2009-07-03 09:31:01| 分类: .NET|字号 订阅 Encoding encoding = Encoding.GetEncod ...
- canvas sprite动画 简单封装
function SpritCtx(img, size, pos, turnTime, totalCount, ctx) { size = size || {}; pos = pos || {}; / ...
- @ManyToMany 两个表多对多关联
两个表属于多对多关系 如 Teacher <=> Student 表teacher 主键 id 表student 主键id 中间关联表 teacher_student 两个字段 t_id ...
- Jquery~$when_done_then的用法
对于$.ajax请求来说,如果层级比较多,程序看起来会比较乱,而为了解决这种问题,才有了$when...done...fail...then的封装,它将$.ajax这嵌套结构转成了顺序平行的结果,向下 ...
- java邮件客户端
/*** *邮件VO **/package net.jk.util.email.vo; import java.util.Date; import java.util.List; import net ...
- ASP.NET常用编程代码(一)
1.为按钮添加确认对话框 Button1.Attributes.Add("onclick","return confirm(’确认?’)");button.at ...
- /root/.bashrc与/etc/profile的异同
要搞清bashrc与profile的区别,首先要弄明白什么是交互式shell和非交互式shell,什么是loginshell 和non-loginshell. 交互式模式就是shell等待你的输入,并 ...