#include <cstdio>
#include <cctype>
#include <algorithm>
namespace fastIO {
const int SZ = 1 << 25;
char ibuf[SZ], *p0 = ibuf, *p1 = ibuf;
char getchar(void) { return p0 == p1 && (p1 = (p0 = ibuf) + fread(ibuf, 1, SZ, stdin), p0 == p1) ? EOF : *p0++; }
char char_read; void read(auto &val) {
val = 0; do char_read = getchar(); while(!isdigit(char_read));
do val = val * 10 + char_read - '0'; while(isdigit(char_read = getchar()));
}
char obuf[SZ], *p = obuf;
void putchar(char char_write) { *p++ = char_write; }
void write(auto val) { if(val >= 10) write(val / 10); putchar(val % 10 + '0'); }
void write(auto a[], int sz) { for(int i = 0; i < sz; ++i) write(a[i]), putchar(' '); putchar('\n'); }
void output(void) { fwrite(obuf, p - obuf, 1, stdout);}
};
const int N = 1 << 21;
const long long p = 998244353;
const long long q = 31596, qq = 62863;
inline long long mul_modp(long long a, long long b) {
long long x = a * b - (long long)((long double)a * b / p) * p; return x < p ? x : x - p;
long long a1 = a / q, a0 = a - a1 * q;
long long b1 = b / q, b0 = b - b1 * q;
return (a0 * b0 + (a0 * b1 + a1 * b0) * q + a1 * b1 * qq) % p;
}
long long pow_modp(long long a, long long b) { long long x = 1; for(; b; a = mul_modp(a, a), b >>= 1) if(b & 1) x = mul_modp(x, a); return x; }
#define w(n) pow_modp( 3, (p - 1) / n)
#define v(n) pow_modp( 332748118, (p - 1) / n)
long long ntt_sup[N];
void ntt(auto a[], int n, long long w) {
auto ntt_a = ntt_sup; for(int i = 1; i < n; i <<= 1, w = mul_modp(w, w), std :: swap(a, ntt_a)) {
auto _w = 1; for(auto k0 = ntt_a, j0 = a, j1 = a + (n >> 1); k0 != ntt_a + n; k0 += i, _w = mul_modp(_w, w))
for(auto k1 = k0 + i, _k0 = k1; k0 != _k0; ++j0, ++j1, ++k0, ++k1)
*k0 = *j0 + *j1 < 0 ? *j0 + *j1 + p : *j0 + *j1 - p,
*k1 = mul_modp(*j0 - *j1, _w);
}
if(ntt_a != ntt_sup) std :: copy(a, a + n, ntt_a);
}
void poly_mul(auto a[], auto b[], int n) {
ntt(a, n, w(n)), ntt(b, n, w(n)); for(int i = 0; i < n; ++i) a[i] = mul_modp(a[i], b[i]); ntt(a, n, v(n));
int inv_n = pow_modp(n, p - 2); for(int i = 0; i < n; ++i) a[i] = mul_modp(a[i], inv_n);
for(int i = 0; i < n; ++i) a[i] = a[i] < 0 ? a[i] + p : a[i];
}
int n, n_a, n_b;
long long a[N], b[N];
int main(void) {
fastIO :: read(n_a), fastIO :: read(n_b); ++n_a, ++n_b; for(n = 1; n < n_a + n_b - 1; n <<= 1);
for(int i = 0; i < n_a; ++i) fastIO :: read(a[i]);
for(int i = 0; i < n_b; ++i) fastIO :: read(b[i]);
poly_mul(a, b, n); n = n_a + n_b - 1;
fastIO :: write(a, n), fastIO :: output();
return 0;
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Subtask #1 Testcase #1 | 8.47 us | 32 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #2 | 46.074 ms | 9 MB + 252 KB | Accepted | Score: 100 | 显示更多 |
| Subtask #1 Testcase #3 | 20.907 ms | 3 MB + 788 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #4 | 20.885 ms | 3 MB + 768 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #5 | 9.58 us | 32 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #6 | 8.63 us | 32 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #7 | 8.96 us | 32 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #8 | 45.282 ms | 8 MB + 676 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #9 | 45.211 ms | 8 MB + 676 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #10 | 44.431 ms | 8 MB + 72 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #11 | 46.338 ms | 9 MB + 416 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #12 | 42.45 ms | 7 MB + 172 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #13 | 8.38 us | 32 KB | Accepted | Score: 0 | 显示更多 |