提交记录 13423


用户 题目 状态 得分 用时 内存 语言 代码长度
CraZYali 1002i. 【模板题】多项式乘法 Accepted 100 58.805 ms 9280 KB C++ 2.67 KB
提交时间 评测时间
2020-08-02 23:13:30 2020-08-02 23:13:34
#define REP(i, s, e) for (register int i(s), end_##i(e); i <= end_##i; i++)
#define DEP(i, s, e) for (register int i(s), end_##i(e); i >= end_##i; i--)
#define DEBUG fprintf(stderr, "Passing [%s] in Line %d\n", __FUNCTION__, __LINE__)

#define chkmax(a, b) (a < (b) ? a = (b) : a)
#define chkmin(a, b) (a > (b) ? a = (b) : a)

#include <algorithm>
#include <vector>
#include <iostream>
#include <cstdio>

using namespace std;
const int MOD = 998244353, inv3 = (MOD + 1) / 3;
#define poly vector <int> 
#define i64 long long
#define ui64 unsigned i64

i64 power_pow(i64 base, int b)
{
	i64 ans = 1;
	while (b)
	{
		if (b & 1) (ans *= base) %= MOD;
		(base *= base) %= MOD;
		b >>= 1;
	}
	return ans;
}
#define inv(x) power_pow(x, MOD - 2)

const int maxn = 1 << 18;
ui64 NTTtmp[maxn];
int R[maxn];
void NTT(poly &a, int n, int flag)
{
	if (a.size() ^ n) a.resize(n);
	if (flag < 0) reverse(a.begin() + 1, a.end());
	static int *w[30], pool[maxn << 1 | 10];
	static bool vis[30];
	w[0] = pool;
	REP(i, 0, n - 1)
	{
		R[i] = (R[i >> 1] >> 1) | ((i & 1) ? (n >> 1) : 0);
		if (i < R[i]) swap(a[i], a[R[i]]);
	}
	REP(i, 0, n - 1) NTTtmp[i] = a[i];
	bool fff = (flag > 0);
	for (int i = 1, ccc = 0; i < n; i <<= 1, ccc++)
	{
		if (!vis[ccc])
		{
			vis[ccc] = 1;
			const i64 wn = power_pow(3, (MOD - 1) >> ccc + 1);
			if (i < maxn) w[ccc + 1] = w[ccc] + i;
			w[ccc][0] = 1;
			REP(j, 1, i - 1) w[ccc][j] = w[ccc][j - 1] * wn % MOD;
		}
		for (int k = 0; k < n; k += i + i)
			for (int l = 0; l < i; l++)
			{
				ui64 x(NTTtmp[k + l]), y(NTTtmp[k + l + i] * w[ccc][l] % MOD);
				NTTtmp[k + l] = x + y;
				NTTtmp[k + l + i] = MOD + x - y;
			}
	}
	REP(i, 0, n - 1) a[i] = NTTtmp[i] % MOD;
	if (flag < 0)
	{
		const int invn = inv(n);
		REP(i, 0, n - 1) a[i] = 1ll * a[i] * invn % MOD;
	}
}

inline int deg(const poly &a) {return a.size() - 1;}
inline poly operator * (poly a, poly b)
{
	int l = 1, n = deg(a), m = deg(b);
	while (l <= n + m) l <<= 1;
	NTT(a, l, 1);NTT(b, l, 1);
	REP(i, 0, l - 1) a[i] = 1ll * a[i] * b[i] % MOD;
	NTT(a, l, -1);
	a.resize(n + m + 1);
	return a;
}
void output(poly a)
{
	REP(i, 0, (int)a.size() - 1) printf("%d%c", a[i], i == end_i ? '\n' : ' ');
}
template <typename T>
inline T read()
{
	T ans = 0, flag = 1;
	char c = getchar();
	while (!isdigit(c))
	{
		if (c == '-') flag = -1;
		c = getchar();
	}
	while (isdigit(c))
	{
		ans = ans * 10 + c - 48;
		c = getchar();
	}
	return ans * flag;
}

#define file(FILE_NAME) freopen(FILE_NAME".in", "r", stdin), freopen(FILE_NAME".out", "w", stdout)

int main()
{
#ifdef CraZYali
	file("qaq");
#endif
	int n = read<int>(), m = read<int>();
	poly a(n + 1), b(m + 1);
	REP(i, 0, n) a[i] = read<int>();
	REP(i, 0, m) b[i] = read<int>();
	output(a * b);
	return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #136.68 us48 KBAcceptedScore: 0

Subtask #1 Testcase #258.805 ms8 MB + 1008 KBAcceptedScore: 0

Subtask #1 Testcase #326.953 ms4 MB + 92 KBAcceptedScore: 100

Subtask #1 Testcase #427.053 ms4 MB + 80 KBAcceptedScore: 0

Subtask #1 Testcase #539.51 us48 KBAcceptedScore: 0

Subtask #1 Testcase #636.73 us48 KBAcceptedScore: 0

Subtask #1 Testcase #738.2 us48 KBAcceptedScore: 0

Subtask #1 Testcase #851.325 ms8 MB + 472 KBAcceptedScore: 0

Subtask #1 Testcase #951.295 ms8 MB + 472 KBAcceptedScore: 0

Subtask #1 Testcase #1044.172 ms7 MB + 956 KBAcceptedScore: 0

Subtask #1 Testcase #1158.794 ms9 MB + 64 KBAcceptedScore: 0

Subtask #1 Testcase #1258.207 ms7 MB + 968 KBAcceptedScore: 0

Subtask #1 Testcase #1336.19 us44 KBAcceptedScore: 0


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