#include <cstdio>
#include <cctype>
#include <algorithm>
namespace fastIO {
const int SZ = 1 << 25;
char ibuf[SZ], *p0 = ibuf, *p1 = ibuf;
inline char getchar(void) { return p0 == p1 && (p1 = (p0 = ibuf) + fread(ibuf, 1, SZ, stdin), p0 == p1) ? EOF : *p0++; }
char char_read; template<typename tpnm> void read(tpnm &val) {
val = 0; do char_read = getchar(); while(!isdigit(char_read));
do val = val * 10 + char_read - '0'; while(isdigit(char_read = getchar())); return;
}
char obuf[SZ], *p = obuf;
inline void putchar(char char_write) { *p++ = char_write; return; }
template<typename tpnm> void write(tpnm val) { if(val >= 10) write(val / 10); putchar(val % 10 + '0'); return; }
template<typename tpnm> inline void write(tpnm a[], int sz) { for(int i = 0; i < sz; ++i) write(a[i].val), putchar(' '); putchar('\n'); }
void output(void) { fwrite(obuf, p - obuf, 1, stdout);}
};
const int N = 1 << 21;
const int p = 81 << 21 | 1;
const int g = 1167 << 12 | 1;
const int h = 11443 << 12 | 1;
int n, n_a, n_b;
struct RING {
int val;
RING operator + (const RING r) const { return (RING){ val + r.val < p ? val + r.val : val + r.val - p }; }
RING operator - (const RING r) const { return (RING){ val - r.val < 0 ? val - r.val + p : val - r.val }; }
RING operator * (const RING r) const { return (RING){ (long long)val * r.val % p }; }
RING operator * (const int w) const { return (RING){ (long long)val * w % p }; }
} a[N], b[N];
inline int pow_modp(int a, int b) { int x = 1; for(; b; a = (long long)a * a % p, b >>= 1) if(b & 1) x = (long long)x * a % p; return x; }
RING ntt_sup[N];
inline void ntt(auto a[], int n, const int g) {
auto b = ntt_sup, j = a, _j = a + n; int _n = n >> 1, i, k, _k, w, _w;
for(i = 1, w = pow_modp(g, (p - 1) / n); i < n; i <<= 1, w = (long long)w * w % p, std :: swap(a, b))
for(k = 0, j = a, _j = a + _n, _w = 1; k != n; k += i << 1, _w = (long long)_w * w % p)
for(int _k = k; _k != k + i; ++_k, ++j, ++_j)
b[_k] = *j + *_j, b[_k + i] = (*j - *_j) * _w;
if(b != ntt_sup) std :: copy(a, a + n, b);
}
inline void poly_mul(auto a[], auto b[], int n) {
ntt(a, n, g), ntt(b, n, g); for(int i = 0; i < n; ++i) a[i] = a[i] * b[i]; ntt(a, n, h);
int inv_n = pow_modp(n, p - 2); for(int i = 0; i < n; ++i) a[i] = a[i] * inv_n;
}
int main(void) {
fastIO :: read(n_a), fastIO :: read(n_b); for(n = 1; n <= n_a + n_b; n <<= 1);
for(int i = 0; i <= n_a; ++i) fastIO :: read(a[i].val);
for(int i = 0; i <= n_b; ++i) fastIO :: read(b[i].val);
poly_mul(a, b, n);
fastIO :: write(a, n_a + n_b + 1), fastIO :: output();
return 0;
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Subtask #1 Testcase #1 | 8.19 us | 32 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #2 | 27.994 ms | 6 MB + 252 KB | Accepted | Score: 100 | 显示更多 |
| Subtask #1 Testcase #3 | 12.362 ms | 2 MB + 276 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #4 | 12.403 ms | 2 MB + 256 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #5 | 9.77 us | 32 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #6 | 7.79 us | 32 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #7 | 8.52 us | 32 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #8 | 27.194 ms | 5 MB + 676 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #9 | 27.174 ms | 5 MB + 676 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #10 | 26.397 ms | 5 MB + 72 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #11 | 28.219 ms | 6 MB + 416 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #12 | 25.038 ms | 4 MB + 172 KB | Accepted | Score: 0 | 显示更多 |
| Subtask #1 Testcase #13 | 7.86 us | 32 KB | Accepted | Score: 0 | 显示更多 |