HDU 1402 A * B Problem Plus FFT入门题
2016-11-05 21:35
357 查看
FFT的理解
大牛的博客1:Ichimei
大牛的博客2:sdj222555
简单的理解
就是对两个多项式乘法求系数
代码
大牛的博客1:Ichimei
大牛的博客2:sdj222555
简单的理解
就是对两个多项式乘法求系数
代码
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int MAXN = 2e5 + 5; 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 = 1, j = len / 2; i < len - 1; i++) { if(i < j)swap(y[i], y[j]); k = len / 2; while( j >= k) { j -= k; k /= 2; } if(j < k) j += k; } } void fft(complex y[], int len, int on) { change(y, len); for(int h = 2; h <= len; h <<= 1) { complex wn(cos(-on * 2 * PI / h), sin(-on * 2 * PI / h)); for(int j = 0; j < len; j += h) { complex w(1, 0); for(int k = j; k < j + h / 2; k++) { complex u = y[k]; complex t = w * y[k + h / 2]; y[k] = u + t; y[k + h / 2] = u - t; w = w * wn; } } } if(on == -1) for(int i = 0; i < len; i++) y[i].r /= len; } char A[MAXN], B[MAXN]; int ans[MAXN]; complex x[MAXN], y[MAXN]; int main() { while(~scanf("%s%s", A, B)) { int lena = 0, len1 = strlen(A); int lenb = 0, len2 = strlen(B); while(1 << lena < len1) lena ++; while(1 << lenb < len2) lenb ++; int len = 1 << max(lena, lenb) + 1; for(int i = 0; i < len; i ++) { if(i < len1) x[i] = complex(A[len1 - i - 1] - '0', 0); else x[i] = complex(0, 0); if(i < len2) y[i] = complex(B[len2 - i - 1] - '0', 0); else y[i] = complex(0, 0); } fft(x, len, 1); fft(y, len, 1); for(int i = 0; i < len; i ++) { x[i] = x[i] * y[i]; } fft(x, len, -1); for(int i = 0; i < len; i ++) { ans[i] = (int)(x[i].r + 0.5); } for(int i = 0; i < len; i ++) { ans[i + 1] += ans[i] / 10; ans[i] %= 10; } int flag = 0; for(int i = len - 1; i >= 0; i --) { if(ans[i] > 0) { flag = 1; printf("%d", ans[i]); continue; } if(flag || i == 0) printf("0"); } printf("\n"); } return 0; }
相关文章推荐
- 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
- hdu1402 A * B Problem Plus (FFT)
- hdu 1402 A * B Problem Plus(FFT)
- FFT(快速傅立叶变换):HDU 1402 A * B Problem Plus
- 【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)
- 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模板题)