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们学习之后发现这个东西的代码实现其实极其简洁 于是趁着还没有忘记赶紧来写一篇博 (说起来这篇东西的 ...
随机推荐
- springMVC3学习(二)--ModelAndView对象
当控制器处理完请求时,一般会将包括视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherServlet. 因此,常常须要在控制器中构造ModelAndView对象. ...
- Linux下得到显示屏参数的方法
先安装一个软件,然后使用权ddcprobe可以查看当前支持的分辨率和刷新频率#sudo apt-get install xresprobe运行 #sudo ddcprobe会得到下面的信息vbe: V ...
- 使用日期工具类:DateUtil
利用java开发,避免不了String.Date转换,前一天.后一天等问题.给出一个工具类,仅供学习交流. import java.text.DateFormat; import java.text. ...
- SPOJ 3048 - DNA Sequences LCS
给出两个字符串(不长于1000),求最长公共子序列,要求:从每个串中取必须取连续k (1<=k<=100)个数 [LCS]一开始自己想用DP加一维[len]用来表示当前已经取了连续len个 ...
- 当ViewPager嵌套在ScrollView/ListView里时,手势冲突如何处理?
有时我们需要将ViewPager嵌套在其他已经含有手势动作的ViewGroup里,如ScrollView,ListView时,会造成手势冲突,如表现为ViewPager向左划时,不小心向上移动了一点距 ...
- JS获取客户端的窗口大小
function getClientSize() { var c = window, b = document, a = b.documentElement; if (c.in ...
- ViewPager滑动特效实现
ewPager最常用于结合Fragment,这是一个方便的方式来供应和管理每个页面的生命周期. MainAcitivity的代码 import java.util.ArrayList; import ...
- EXT ajax简单实例
转载:http://www.cnblogs.com/xiepeixing/archive/2012/10/24/2736751.html EXT ajax request是ext中对于ajax请求的实 ...
- 3.题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
public static void main(String[] args) { Scanner scanner=new Scanner(System.in); ...
- 【windows开发实现记事本程序——界面篇】
前言 从毕业开始学习windows UI编程,工作中总是和一些API打交道,但是从没有做过一个完整的界面程序.因此打算自己利用空余时间做一个小的项目来总结自己所学的东西.在网上看到许多人建议自己动手写 ...