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们学习之后发现这个东西的代码实现其实极其简洁 于是趁着还没有忘记赶紧来写一篇博 (说起来这篇东西的 ...
随机推荐
- htaccess 正则规则整理(转)
为了方便 htaccess 编写正则,这里整理了一下 htaccess 的正则规则. # —— 位于行首时表示注释. [F] —— Forbidden(禁止): 命令服务器返回 403 Forbidd ...
- 《Android开发艺术探索》读书笔记 (7) 第7章 Android动画深入分析
本节和<Android群英传>中的第七章Android动画机制与使用技巧有关系,建议先阅读该章的总结 第7章 Android动画深入分析 7.1 View动画 (1)android动画分为 ...
- HDU 5105 Math Problem
让求 f(x)=|a∗x3+b∗x2+c∗x+d|(L≤x≤R)的最大值 这个题目讨论a和b的值,如果a==0的话,那么这个方程就变成了一个一元二次方程,直接找端点和对称轴(如果对称轴在给定的区间内 ...
- html02表格的使用
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- SQL 里面的COALESCE函数
在SQL里面除了is null 还有这样一个还用的方法 COALESCE(值[, ...]) select COALESCE(NULL,NULL,'AAAA') -> 'AAAA' 意思是前面的 ...
- 开发solr功能问题点
Criteria criteria = new Criteria(); public Criteria and(Criteria criteria) { this.criteriaChain.add( ...
- 安装php时,make test报错
Build complete. Don't forget to run 'make test'. [root@localhost php-5.4.5]# make test ERROR: Cannot ...
- Swift - 22 - 循环结构
//: Playground - noun: a place where people can play import UIKit // for-in for i in -99...99 { i * ...
- 五、C# 类
面向对象编程 类是面向对象编程的3个主要特征---封装.继承和多态性---的基础. 封装允许隐藏细节. 继承 继承关系至少涉及两个类,其中一个类(基类)是另一个类的更泛化的版本. 为了从一 ...
- Animator Override Controllers 学习及性能测试
本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/Unity_AnimatorOverrideContorller.html The ...