BZOJ 2179 [快速傅里叶变换 高精度乘法]
2017-02-10 23:24
288 查看
2179: FFT快速傅立叶
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 3108 Solved: 1599
[Submit][Status][Discuss]
Description
给出两个n位10进制整数x和y,你需要计算x*y。Input
第一行一个正整数n。 第二行描述一个位数为n的正整数x。 第三行描述一个位数为n的正整数y。数据范围:
n<=60000
扔个模板
注意读入字符转换成系数 系数转换成整数
#include <iostream> #include <cstdio> #include <string> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const int N=3e5+5; inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } ll P=1004535809,MOD=P; ll Pow(ll a,ll b,ll MOD){ ll ans=1; for(;b;b>>=1,a=a*a%MOD) if(b&1) ans=ans*a%MOD; return ans; } struct NumberTheoreticTransform{ int n,rev ; ll g; void ini(int m){ n=1; while(n<m) n<<=1; int k=0; while((1<<k)<n) k++; for(int i=0;i<n;i++){ int t=0; for(int j=0;j<k;j++) if(i&(1<<j)) t|=(1<<(k-j-1)); rev[i]=t; } g=3; } void DFT(ll *a,int flag){ for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]); for(int l=2;l<=n;l<<=1){ int m=l>>1; ll wn=Pow(g,flag==1?(P-1)/l:P-1-(P-1)/l,P); for(ll *p=a;p!=a+n;p+=l){ ll w=1; for(int k=0;k<m;k++){ ll t=w*p[k+m]%P; p[k+m]=(p[k]-t+P)%P; p[k]=(p[k]+t)%P; w=w*wn%P; } } } if(flag==-1){ ll inv=Pow(n,P-2,P);; for(int i=0;i<n;i++) a[i]=a[i]*inv%P; } } void MUL(ll *A,ll *B){ DFT(A,1);DFT(B,1); for(int i=0;i<n;i++) A[i]=A[i]*B[i]%MOD; DFT(A,-1); } }fft; int n,m,c ; char s1 ,s2 ; ll A ,B ; int main(){ freopen("in","r",stdin); n=read();m=n+n-1; scanf("%s%s",s1,s2); for(int i=0;i<n;i++) A[i]=s1[n-i-1]-'0',B[i]=s2[n-i-1]-'0'; fft.ini(m); fft.MUL(A,B); for(int i=0;i<m;i++) c[i]=A[i];//printf("c %d\n",c[i]); for(int i=0;i<m;i++) c[i+1]+=c[i]/10,c[i]%=10; while(c[m]) m++; for(int i=m-1;i>=0;i--) printf("%d",c[i]); }
NNT 3728ms
相关文章推荐
- [BZOJ2179]大整数乘法 快速傅里叶变换
- bzoj 2179 [快速傅里叶变换]
- [BZOJ2179]-大数乘法-FFT模板
- hdu1402 A * B Problem Plus 高精度乘法 快速傅里叶变换(FFT)
- HDU 1402 POJ 2389 BZOJ 2179 大整数乘法 FFT
- 【快速傅里叶变换】【FFT】【WikiOI】【P3132】【高精度练习之超大整数乘法】
- bzoj2179 FFT快速傅立叶(大整数乘法,fft)
- 【bzoj1754/Usaco2005 qua】Bull Math——高精度乘法
- HDU 1402 快速傅里叶变换(FFT)实现高精度乘法
- HDU 1402 快速傅里叶变换(FFT)实现高精度乘法
- BZOJ 2179 FFT快速傅立叶 快速傅里叶变换
- 【CodeVS 3123】高精度练习之超大整数乘法 &【BZOJ 2197】FFT快速傅立叶
- 【BZOJ2179】FFT快速傅立叶 高精度乘模板题
- 快速傅里叶变换 FFT 模板【bzoj2179】 FFT快速傅立叶
- BZOJ 1263 [SCOI2006]整数划分 - 高精度乘法
- FFT:快速傅里叶变换与高精度乘法
- 【bzoj2179】FFT快速傅立叶
- HDU-1063 高精度实数乘法
- 高精度加法和乘法的c++实现
- POJ1001 Exponentiation--浮点数的高精度乘法