FFT模板(BZOJ2179)
2016-12-14 19:34
399 查看
实现了两个长度为n的大数相乘。
#include <cstdio> #include <cmath> #include <complex> using namespace std; #define pi acos(-1) typedef complex<double> C; const int N = 131100; char s ,t ; int n,m,l,r ,c ; C a ,b ; void fft(C *a, int f) { for(int i = 0; i < n; i++) if(r[i] > i) swap(a[i], a[r[i]]); for(int i = 1; i < n; i <<= 1) { C wn(cos(pi/i), f*sin(pi/i)); for(int j = 0; j < n; j += i<<1) { C w = 1; for(int k = 0; k < i; k++, w *= wn) { C x = a[j+k], y = w*a[j+k+i]; a[j+k] = x+y, a[j+k+i] = x-y; } } } } int main() { scanf("%d%s%s", &m, s, t); for(int i = 0; i < m; i++) a[i] = s[m-i-1]-'0', b[i] = t[m-i-1]-'0'; for(n = 1, m <<= 1; n < m; n <<= 1) l++; for(int i = 0; i < n; i++) r[i] = (r[i>>1]>>1)|((i&1)<<(l-1)); fft(a, 1), fft(b, 1); for(int i = 0; i < n; i++) a[i] *= b[i]; fft(a, -1); for(int i = 0; i < n; i++) a[i] /= n; for(int i = 0; i < m; i++) c[i] = (int)(a[i].real()+0.1); for(int i = 0; i < m; i++) if(c[i] >= 10) { c[i+1] += c[i]/10, c[i] %= 10; } else if(!c[i] && i == m-1) m--; for(int i = m-1; ~i; i--) printf("%d", c[i]); return 0; }
相关文章推荐
- [UOJ34]FFT && NTT 模板
- BZOJ 2179 FFT模板
- 快速傅立叶变换FFT模板
- FFT模板
- 【LuoguP3803】多项式乘法-FFT/NTT模板题(附带FFT/NTT简单介绍)
- FFT乘法模板
- 基于FFT的模板匹配
- 洛谷P3803 【模板】多项式乘法(FFT)
- BZOJ 2179 FFT模板
- UOJ#34 FFT模板题
- FFT模板
- hdu 1402 A * B Problem Plus FFT模板
- FFT模板
- 【BZOJ2179】FFT快速傅立叶 高精度乘模板题
- 洛谷P4245:【模板】MTT (拆系数+FFT)
- [FFT 模板题] HDU 1402:A*B Problem Plus
- 【BZOJ 2179】【FFT模板】 FFT快速傅立叶
- FFT 模板
- [HDU1402]A * B Problem Plus && FFT模板
- UOJ#34 FFT模板题