[codevs3123]大整数乘法(快速傅立叶变换FFT)
来源:互联网 发布:只有我不在的城市 知乎 编辑:程序博客网 时间:2024/06/05 22:10
【题意】
给出两个整数a和b,输出a*b的值
【输入】
输入两行
第一行输入a
第二行输入b
【输出】
输出一行
输出a*b
【样例输入】
2
3
【样例输出】
6
【提示】
1<=a<=10^100000,1<=b<=10^100000
为什么大整数乘法可以用FFT做呢?
因为你可以把一个整数拆分成多项式的形式,譬如说123就可以拆分成
123=1*10^2+2*10^1+3*10^0
那么吧两个整数相乘看成两个多项式相乘就可以啦,注意要去掉前导零。
code
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int maxn=100010;const double pi=acos(-1.0);struct complex{ double r,i; complex(){}; complex(double _r,double _i){r=_r,i=_i;} friend complex operator + (const complex &x,const complex &y){return complex(x.r+y.r,x.i+y.i);} friend complex operator - (const complex &x,const complex &y){return complex(x.r-y.r,x.i-y.i);} friend complex operator * (const complex &x,const complex &y){return complex(x.r*y.r-x.i*y.i,x.r*y.i+x.i*y.r);}}a[maxn*4],b[maxn*4];int n,m;int R[maxn*4];void fft(complex *y,int len,int op){ for(int i=0;i<len;i++) if(i<R[i]) swap(y[i],y[R[i]]); for(int i=1;i<len;i<<=1) { complex wn(cos(pi/i),sin(op*pi/i)); for(int j=0;j<len;j+=(i<<1)) { complex w(1,0); for(int k=0;k<i;k++,w=w*wn) { complex u=y[j+k]; complex v=w*y[j+k+i]; y[j+k]=u+v; y[j+k+i]=u-v; } } } if(op==-1) for(int i=0;i<len;i++) y[i].r/=len;}char s1[maxn],s2[maxn];int sum[maxn];int main(){ scanf("%s%s",s1,s2); int len1=strlen(s1),len2=strlen(s2); for(int i=0;i<len1;i++) a[i].r=s1[len1-i-1]-'0'; for(int i=0;i<len2;i++) b[i].r=s2[len2-i-1]-'0'; for(int i=len1;i<len1+len2;i++) a[i].r=0; for(int i=len2;i<len1+len2;i++) b[i].r=0; len1+=len2; int L=0; int len=1; while(len<=len1) { L++; len*=2; } for(int i=0;i<len;i++) R[i]=(R[i>>1]>>1)|(i&1)<<(L-1); fft(a,len,1); fft(b,len,1); for(int i=0;i<len;i++) a[i]=a[i]*b[i]; fft(a,len,-1); for(int i=0;i<len1;i++) sum[i]=int(a[i].r+0.5); for(int i=0;i<len1;i++) { sum[i+1]+=sum[i]/10; sum[i]%=10; } len1--; while(sum[len1]==0 && len1>0) len1--; for(int i=len1;i>=0;i--) printf("%c",sum[i]+'0'); return 0;}
阅读全文
0 0
- [codevs3123]大整数乘法(快速傅立叶变换FFT)
- [UOJ34]多项式乘法(快速傅立叶变换FFT)
- 快速傅立叶变换(FFT)
- 快速傅立叶变换(FFT)
- 【FFT-快速傅立叶变换】
- 快速傅立叶变换FFT
- UOJ #34 多项式乘法 FFT快速傅立叶变换
- 大整数乘法(FFT)
- 快速傅立叶变换算法 FFT
- 大数乘法(快速傅立叶变换)上
- 大数乘法(快速傅立叶变换)下
- 大整数FFT乘法
- 【FFT】大整数乘法
- 快速傅立叶变换(FFT)的C++实现
- 快速傅立叶变换(FFT)的C#代码
- 快速傅立叶变换(FFT)C语言函数
- [BZOJ4503]两个串(快速傅立叶变换FFT)
- 第一次邂逅快速傅立叶变换(FFT)
- 主机ping不同虚拟机的问题解决方案
- WPF通知窗口
- c++ string split分割字符串
- 字符型基础
- Gensim Word2vec 使用教程
- [codevs3123]大整数乘法(快速傅立叶变换FFT)
- js es6 promise用法
- 源码编译安装nginx和python
- 梯度下降求解逻辑回归(代码)
- 计算机网络
- convex hull
- 简单工厂模式
- JavaScript栈内存和堆内存区别
- 第1章 机器学习基础