提交记录 7877


用户 题目 状态 得分 用时 内存 语言 代码长度
Dustii 1002i. 【模板题】多项式乘法 Accepted 100 70.265 ms 18964 KB C++11 2.23 KB
提交时间 评测时间
2019-01-25 19:17:00 2020-08-01 01:09:35
#include <cmath>
#include <cstdio>
#include <algorithm>

typedef unsigned long long ull;
const size_t maxL = 1 << 18 | 1;
const double pi = std::acos(-1.0);

struct complex_t
{
	double a, b; //a + bi
	complex_t(double _a = 0.0, double _b = 0.0) : a(_a), b(_b) {}
} A[maxL], B[maxL];;
inline complex_t operator+(const complex_t &a, const complex_t &b)
{
	return complex_t(a.a + b.a, a.b + b.b);
}
inline complex_t operator-(const complex_t &a, const complex_t &b)
{
	return complex_t(a.a - b.a, a.b - b.b);
}
inline complex_t operator*(const complex_t &a, const complex_t &b)
{
	return complex_t(a.a * b.a - a.b * b.b, a.a * b.b + a.b * b.a);
}

int N, M;
int Rev[maxL];

void DFT_pre(int l, int bitcnt)
{
	for (int i = 1; i != l; ++i)
		Rev[i] = (Rev[i >> 1] >> 1) | ((i & 1) << bitcnt - 1);
}

void DFT(complex_t *a, int n)
{
	for (int i = 1; i != n; ++i)
		if (i < Rev[i])
			std::swap(a[i], a[Rev[i]]);
	for (int l = 1; l != n; l <<= 1)
	{
		complex_t w0(std::cos(pi / l), std::sin(pi / l));
		static complex_t wn[maxL];
		wn[0] = 1.0;
		for (int i = 1; i != l; ++i)
			wn[i] = wn[i - 1] * w0;
		for (int i = 0; i != n; i += l * 2)
			for (int j = 0; j != l; ++j)
			{
				auto x = a[i + j], y = wn[j] * a[i + l + j];
				a[i + j] = x + y;
				a[i + l + j] = x - y;
			}
	}
}

void iDFT(complex_t *a, int n)
{
	for (int i = 1; i != n; ++i)
		if (i < Rev[i])
			std::swap(a[i], a[Rev[i]]);
	for (int l = 1; l != n; l <<= 1)
	{
		complex_t w0(std::cos(pi / l), -std::sin(pi / l));
		static complex_t wn[maxL];
		wn[0] = 1.0;
		for (int i = 1; i != l; ++i)
			wn[i] = wn[i - 1] * w0;
		for (int i = 0; i != n; i += l * 2)
			for (int j = 0; j != l; ++j)
			{
				auto x = a[i + j], y = wn[j] * a[i + l + j];
				a[i + j] = x + y;
				a[i + l + j] = x - y;
			}
	}
	for (int i = 0; i != n; ++i)
		a[i].a /= n;
}

int main()
{
	scanf("%d%d", &N, &M);
	for (int i = 0, x; i <= N; ++i)
	{
		scanf("%d", &x);
		A[i].a = x;
	}
	for (int i = 0, x; i <= M; ++i)
	{
		scanf("%d", &x);
		B[i].a = x;
	}
	
	int l = 1, bitcnt = 0;
	
	while (l <= N + M)
		l <<= 1, ++bitcnt;
	
	DFT_pre(l, bitcnt);
	DFT(A, l);
	DFT(B, l);
	
	for (int i = 0; i != l; ++i)
		A[i] = A[i] * B[i];
	
	iDFT(A, l);
	
	for (int i = 0; i <= N + M; ++i)
		printf("%d%c", (int)(A[i].a + 0.5), " \n"[i == N + M]);

	return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #11.787 ms16 MB + 28 KBAcceptedScore: 0

Subtask #1 Testcase #269.839 ms18 MB + 452 KBAcceptedScore: 100

Subtask #1 Testcase #333.018 ms16 MB + 820 KBAcceptedScore: 0

Subtask #1 Testcase #433.079 ms16 MB + 808 KBAcceptedScore: 0

Subtask #1 Testcase #51.864 ms16 MB + 28 KBAcceptedScore: 0

Subtask #1 Testcase #61.79 ms16 MB + 28 KBAcceptedScore: 0

Subtask #1 Testcase #71.787 ms16 MB + 28 KBAcceptedScore: 0

Subtask #1 Testcase #862.372 ms18 MB + 184 KBAcceptedScore: 0

Subtask #1 Testcase #962.31 ms18 MB + 184 KBAcceptedScore: 0

Subtask #1 Testcase #1054.837 ms17 MB + 940 KBAcceptedScore: 0

Subtask #1 Testcase #1170.265 ms18 MB + 532 KBAcceptedScore: 0

Subtask #1 Testcase #1270.209 ms17 MB + 412 KBAcceptedScore: 0

Subtask #1 Testcase #13891.73 us8 MB + 32 KBAcceptedScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2024-04-26 18:54:27 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用