[HDU1402]A * B Problem Plus && FFT模板

複習了一發FFT的模板 然後只想說 這TM到底都是在幹啥QAQ 

好吧 以後要找機會重新學QAQ 

存個模板在這裏 

今天看那個數學也是醉了啊orzorz

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<complex>
#define SF scanf
#define PF printf
#define DPI (PI*2)
using namespace std;
typedef long long LL;
const double PI = acos(-1.0);
const int MAXN = 200000;
char A[MAXN+10], B[MAXN+10];
int ans[MAXN+10];
struct cpx {
	double re, im;
	cpx () {}
	cpx(double a, double b) : re(a), im(b) {}
	cpx operator + (const cpx &t) {
		return cpx(re + t.re, im + t.im);
	}
	cpx operator - (const cpx &t) {
		return cpx(re - t.re, im - t.im);
	}
	cpx operator * (const cpx &t) {
		return cpx(re * t.re - im * t.im, im * t.re + re * t.im);
	}
} xi[MAXN+10], xo[MAXN+10], yi[MAXN+10], yo[MAXN+10];
cpx EXP(double theta) {
	return cpx(cos(theta), sin(theta));
}
void FFT(cpx *X, int n, int dir) {
	for(int i = 0, j = 0; i < n; i++) {
		if(j > i) swap(X[i], X[j]);
		int k = n;
		while(j & (k >>= 1)) j ^= k;
		j |= k;
	}
	for(int step = 1; step < n; step <<= 1) {
		double angle = dir * PI / step;
		for(int k = 0; k < step; k++) {
			cpx omegak = EXP(angle * k);
			for(int Ek = k; Ek < n; Ek += step << 1) {
				int KK = Ek + step;
				cpx t = omegak * X[KK];
				X[KK] = X[Ek] - t;
				X[Ek] = X[Ek] + t;
			}
		}
	}
}
void trans(cpx *xi, char *A, int len, int len1) {
	for(int i = 0; i <= len; i++) {
		if(i < (len1 >> 1)) {
			xi[i].re = A[i] - '0';
			xi[i].im = 0;
		}
		else xi[i].re = xi[i].im = 0;
	}
}
int main() {
	while(~SF("%s%s", A, B)) {
		int len1 = strlen(A) << 1, len2 = strlen(B) << 1;
		int len = 1, Maxl = max(len1, len2);
		while(len < Maxl) len <<= 1;
		trans(xi, A, len, len1);
		trans(yi, B, len, len2);
		FFT(xi, len, 1);
		FFT(yi, len, 1);
		for(int i = 0; i < len; i++) xi[i] = xi[i] * yi[i];
		FFT(xi, len, -1);
		for(int i = 0; i < len; i++) xi[i].re /= len;
		int over = len = 0;
		for(int i = ((len1 + len2) >> 1) - 2; i >= 0; i--) {
			int t = xi[i].re + over + 0.5;
			ans[len++] = t % 10;
			over = t / 10;
		}
		while(over) ans[len++] = over % 10, over /= 10;
		len--;
		while(len >= 0 && !ans[len]) len--;
		if(len < 0) len = 0;
		for(int i = len; i >= 0; i--) PF("%d", ans[i]);
		puts("");
	}
}


發佈了192 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章