HDU 1402 FFT

#include <bits/stdc++.h>
using namespace std;
typedef complex<double> CPX;
const int maxn = 2E5 + 10;
const double PI = acos(-1);
char s1[maxn], s2[maxn];
int ans[maxn];
void FFT(vector<CPX>&A, int op)
{
	int n = A.size();
	for (int i = 0, j = 0, k; i < n; i++)
	{
		if (j > i) swap(A[i], A[j]);
		for (k = n; j & (k >>= 1); j &= (~k));
		j |= k;
	}
	double pi = PI * op;
	for (int m = 1; m < n; m <<= 1)
		for (int i = 0; i < m; i++)
		{
			CPX tmp = exp(CPX(0, pi / m * i));
			for (int j = i; j < n; j += (m << 1))
			{
				CPX t = tmp * A[j + m];
				A[j + m] = A[j] - t, A[j] = A[j] + t;
			}
		}
	if (op == -1) for (int i = 0; i < n; i++) A[i] /= n;
}
void INT_CPX(char *s, vector<CPX> &o)
{
	int len = strlen(s);
	for (int i = 0; s[i]; i++)
		o[len - i - 1].real(s[i] - 48);
}
void CPX_INT(vector<CPX> O, int *n)
{
	for (int i = 0; i < O.size(); i++) n[i] = O[i].real() + 0.5;
	for (int i = 0; i < O.size(); i++) n[i + 1] += n[i] / 10, n[i] %= 10;
}
bool readin()
{
	if (scanf("%s", s1) == EOF) return 0;
	else return scanf("%s", s2), 1;
}
void writeout(int *n, int len)
{
	for (len--; ans[len] == 0 && len; len--);
	for (; len >= 0; len--) printf("%d", n[len]);
	printf("\n");
}
void MULT(char *a, char *b)
{
	int len1 = strlen(a) << 1, len2 = strlen(b) << 1, len = 1;
	while (len < max(len1, len2)) len <<= 1;
	vector<CPX> X(len, 0), Y(len, 0), Z(len, 0);
	INT_CPX(a, X), INT_CPX(b, Y);
	FFT(X, 1), FFT(Y, 1);
	for (int i = 0; i < len; i++) Z[i] = X[i] * Y[i];
	FFT(Z, -1);
	memset(ans, 0, sizeof(ans));
	CPX_INT(Z, ans);
	writeout(ans, len);
}
int main(int argc, char const *argv[])
{
	while (readin()) MULT(s1, s2);
	return 0;
}


FFT的模板运用,A*B problem。

你可能感兴趣的:(HDU 1402 FFT)