#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;
}
Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
Subtask #1 Testcase #1 | 36.68 us | 48 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #2 | 58.805 ms | 8 MB + 1008 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #3 | 26.953 ms | 4 MB + 92 KB | Accepted | Score: 100 | 显示更多 |
Subtask #1 Testcase #4 | 27.053 ms | 4 MB + 80 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #5 | 39.51 us | 48 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #6 | 36.73 us | 48 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #7 | 38.2 us | 48 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #8 | 51.325 ms | 8 MB + 472 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #9 | 51.295 ms | 8 MB + 472 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #10 | 44.172 ms | 7 MB + 956 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #11 | 58.794 ms | 9 MB + 64 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #12 | 58.207 ms | 7 MB + 968 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #13 | 36.19 us | 44 KB | Accepted | Score: 0 | 显示更多 |