HDU 1402 A * B Problem Plus(FFT模版题)
2016-10-08 10:50
351 查看
10W长度的大数A∗B,直接n2会T,用FFT优化nlogn过
代码:
代码:
#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <string> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> #pragma comment(linker,"/STACK:102400000,102400000") using namespace std; #define MAX 100010 #define MAXN 1000005 #define maxnode 5 #define sigma_size 30 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lrt rt<<1 #define rrt rt<<1|1 #define middle int m=(r+l)>>1 #define LL long long #define ull unsigned long long #define mem(x,v) memset(x,v,sizeof(x)) #define lowbit(x) (x&-x) #define pii pair<int,int> #define bits(a) __builtin_popcount(a) #define mk make_pair #define limit 10000 //const int prime = 999983; const int INF = 0x3f3f3f3f; const LL INFF = 0x3f3f; //const double PI = acos(-1.0); const double inf = 1e18; const double eps = 1e-6; const LL mod = 1e9+7; const ull mx = 133333331; /*****************************************************/ inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; } /*****************************************************/ const double PI = acos(-1.0); struct Complex { double real, image; Complex(double _real, double _image) { real = _real; image = _image; } Complex(){} }; Complex operator + (const Complex &c1, const Complex &c2) { return Complex(c1.real + c2.real, c1.image + c2.image); } Complex operator - (const Complex &c1, const Complex &c2) { return Complex(c1.real - c2.real, c1.image - c2.image); } Complex operator * (const Complex &c1, const Complex &c2) { return Complex(c1.real*c2.real - c1.image*c2.image, c1.real*c2.image + c1.image*c2.real); } int rev(int id, int len) { int ret = 0; for(int i = 0; (1 << i) < len; i++) { ret <<= 1; if(id & (1 << i)) ret |= 1; } return ret; } Complex A[140000]; void FFT(Complex* a, int len, int DFT){//对a进行DFT或者逆DFT, 结果存在a当中 //Complex* A = new Complex[len]; 这么写会爆栈 for(int i = 0; i < len; i++) A[rev(i, len)] = a[i]; for(int s = 1; (1 << s) <= len; s++) { int m = (1 << s); Complex wm = Complex(cos(DFT*2*PI/m), sin(DFT*2*PI/m)); for(int k = 0; k < len; k += m) { Complex w = Complex(1, 0); for(int j = 0; j < (m >> 1); j++) { Complex t = w*A[k + j + (m >> 1)]; Complex u = A[k + j]; A[k + j] = u + t; A[k + j + (m >> 1)] = u - t; w = w*wm; } } } if(DFT == -1) for(int i = 0; i < len; i++) A[i].real /= len, A[i].image /= len; for(int i = 0; i < len; i++) a[i] = A[i]; return; } char numA[50010], numB[50010];//以每一位为系数, 那么多项式长度不超过50000 Complex a[140000], b[140000];//对应的乘积的长度不会超过100000, 也就是不超过(1 << 17) = 131072 int ans[140000]; int main(){ //freopen("in.txt","r",stdin); while(~scanf("%s",numA)){ scanf("%s",numB); int len1=strlen(numA); int len2=strlen(numB); int sa=0; int sb=0; while((1<<sa)<len1) sa++; while((1<<sb)<len2) sb++; int len=(1<<(max(sa,sb)+1)); for(int i=0;i<len;i++){ if(i<len1) a[i]=Complex(numA[len1-1-i]-'0',0); else a[i]=Complex(0,0); if(i<len2) b[i]=Complex(numB[len2-1-i]-'0',0); else b[i]=Complex(0,0); } 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<len;i++) ans[i]=floor(a[i].real+0.5); for(int i=0;i<len-1;i++){ ans[i+1]+=ans[i]/10; ans[i]%=10; } int pos=0; for(int i=len-1;i>=0;i--){ if(ans[i]){ pos=i; break; } } for(int i=pos;i>=0;i--) printf("%d",ans[i]); cout<<endl; } return 0; }
相关文章推荐
- hdu1402 A * B Problem Plus (FFT)
- HDU 1402 A * B Problem Plus (FFT求高精度乘法)
- HDU 1402 A * B Problem Plus (FFT入门,高精度乘法)
- HDU 1402 A * B Problem Plus (FFT求高精度乘法)
- HDU 1402 A * B Problem Plus(FFT)
- HDU 1402 A * B Problem Plus (FFT, 大整数乘法)
- hdu 1402 A * B Problem Plus (FFT&DFT)
- HDU 1402 A * B Problem Plus FFT入门题
- hdu 1402 (FFT 模版)
- HDU 1402 A * B Problem Plus (FFT求高精度乘法)
- hdu 1402 A * B Problem Plus FFT
- hdu 1402 A * B Problem Plus(FFT)
- HDU 1402 A * B Problem Plus (FFT求高精度乘法)
- hdu 1402 A * B Problem Plus(FFT-大整数乘法)
- HDU 1402 A * B Problem Plus(FFT)
- HDU 1402 A * B Problem Plus (FFT模板题)
- hdu 1402 A * B Problem Plus FFT
- HDU 1402 A * B Problem Plus (FFT求高精度乘法)
- HDU 1402 A * B Problem Plus (FFT, 大整数乘法)
- HDU 1402 A * B Problem Plus (FFT求高精度乘法)