提交记录 7886


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

typedef unsigned long long ull;
const size_t maxL = 1 << 18 | 1;
const int Mod = 998244353;

int fexp(int base, int exp)
{
	int res = 1;
	for (; exp; exp >>= 1, base = (ull)base * base % Mod)
		if (exp & 1)
			res = (ull)res * base % Mod;
	return res;
}
inline int getinv(int x)
{
	return fexp(x, Mod - 2);
}

const int g = 3, invg = getinv(g);

int N, M;
int A[maxL], B[maxL];
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(int *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)
	{
		int w0 = fexp(g, (Mod - 1) / (l * 2));
		static int wn[maxL];
		wn[0] = 1;
		for (int i = 1; i != l; ++i)
			wn[i] = (ull)wn[i - 1] * w0 % Mod;
		for (int i = 0; i != n; i += l * 2)
			for (int j = 0; j != l; ++j)
			{
				int x = a[i + j], y = (ull)wn[j] * a[i + l + j] % Mod;
				a[i + j] = (x + y) % Mod;
				a[i + l + j] = (x + Mod - y) % Mod;
			}
	}
}

void iDFT(int *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)
	{
		int w0 = fexp(invg, (Mod - 1) / (l * 2));
		static int wn[maxL];
		wn[0] = 1;
		for (int i = 1; i != l; ++i)
			wn[i] = (ull)wn[i - 1] * w0 % Mod;
		for (int i = 0; i != n; i += l * 2)
			for (int j = 0; j != l; ++j)
			{
				int x = a[i + j], y = (ull)wn[j] * a[i + l + j] % Mod;
				a[i + j] = (x + y) % Mod;
				a[i + l + j] = (x + Mod - y) % Mod;
			}
	}
	int inv = getinv(n);
	for (int i = 0; i != n; ++i)
		a[i] = (ull)a[i] * inv % Mod;
}

int main()
{
	scanf("%d%d", &N, &M);
	for (int i = 0; i <= N; ++i)
		scanf("%d", A + i);
	for (int i = 0; i <= M; ++i)
		scanf("%d", B + i);
	
	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] = (ull)A[i] * B[i] % Mod;
	
	iDFT(A, l);
	
	for (int i = 0; i <= N + M; ++i)
		printf("%d%c", A[i], " \n"[i == N + M]);

	return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #110.8 us36 KBAcceptedScore: 0

Subtask #1 Testcase #271.992 ms5 MB + 452 KBAcceptedScore: 0

Subtask #1 Testcase #333.622 ms2 MB + 316 KBAcceptedScore: 100

Subtask #1 Testcase #433.625 ms2 MB + 304 KBAcceptedScore: 0

Subtask #1 Testcase #512.93 us36 KBAcceptedScore: 0

Subtask #1 Testcase #612.45 us36 KBAcceptedScore: 0

Subtask #1 Testcase #712.57 us36 KBAcceptedScore: 0

Subtask #1 Testcase #864.783 ms5 MB + 184 KBAcceptedScore: 0

Subtask #1 Testcase #964.566 ms5 MB + 184 KBAcceptedScore: 0

Subtask #1 Testcase #1057.152 ms4 MB + 940 KBAcceptedScore: 0

Subtask #1 Testcase #1172.363 ms5 MB + 532 KBAcceptedScore: 0

Subtask #1 Testcase #1272.162 ms4 MB + 412 KBAcceptedScore: 0

Subtask #1 Testcase #139.55 us32 KBAcceptedScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-07 17:53:36 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠