提交记录 8513


用户 题目 状态 得分 用时 内存 语言 代码长度
memset0 1002i. 【模板题】多项式乘法 Accepted 100 40.591 ms 5680 KB C++ 2.92 KB
提交时间 评测时间
2019-02-21 12:42:33 2020-08-01 01:20:09
// =================================
//   author: memset0
//   date: 2019.02.17 17:16:00
//   website: https://memset0.cn/
// =================================
#include <bits/stdc++.h>
#define ll long long
#define poly std::vector <int>
#define for_each(i, a) for (int i = 0, __lim = a.size(); i < __lim; ++i)
namespace ringo {
template <class T> inline void read(T &x) {
    x = 0; register char c = getchar(); register bool f = 0;
    while (!isdigit(c)) f ^= c == '-', c = getchar();
    while (isdigit(c)) x = x * 10 + c - '0', c = getchar();
    if (f) x = -x;
}
template <class T> inline void print(T x) {
    if (x < 0) putchar('-'), x = -x;
    if (x > 9) print(x / 10);
    putchar('0' + x % 10);
}
template <class T> inline void print(T x, char c) { print(x), putchar(c); }
inline void print(const poly &a) { for_each(i, a) print(a[i], " \n"[i == __lim - 1]); }
inline void read(poly &a, int n) { for (int i = 0, x; i < n; i++) read(x), a.push_back(x); }

const int N = 1e5 + 10, M = 4e5 + 10, mod = 998244353;

namespace poly_namespace {
    const int SIZE = sizeof(int);
    int w[M], rev[M];
    inline poly resize(poly f, int n) { return f.resize(n), f; }
    inline int dec(int a, int b) { a -= b; return a < 0 ? a + mod : a; }
    inline int sub(int a, int b) { a += b; return a >= mod ? a - mod : a; }
    inline int inv(int x) { return x < 2 ? 1 : (ll)(mod - mod / x) * inv(mod % x) % mod; }
    inline int fpow(int a, int b) { int s = 1; for (; b; b >>= 1, a = (ll)a * a % mod) if (b & 1) s = (ll)s * a % mod; return s; }
    void ntt(int *a, int lim) {
        for (int i = 0; i < lim; i++) if (i < rev[i]) std::swap(a[i], a[rev[i]]);
        for (int len = 1; len < lim; len <<= 1)
            for (int i = 0; i < lim; i += (len << 1))
                for (int j = 0; j < len; j++) {
                    int x = a[i + j], y = (ll)w[j + len] * a[i + j + len] % mod;
                    a[i + j] = sub(x, y), a[i + j + len] = dec(x, y);
                }
    }
    int init(int len) {
        int lim = 1, k = 0; while (lim < len) lim <<= 1, ++k;
        for (int i = 0; i < lim; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (k - 1));
        return lim;
    }
    void main_init(int lim) {
        for (int len = 1, wn, __lim = std::min(lim + 2, M); len < __lim; len <<= 1) {
            wn = fpow(3, (mod - 1) / (len << 1)), w[len] = 1;
            for (int i = 1; i < len; i++) w[i + len] = (ll)w[i + len - 1] * wn % mod;
        }
    }
} using namespace poly_namespace;

void main() {
	int n, m; static int a[M], b[M];
    read(n), read(m), ++n, ++m, main_init(n + m);
	for (int i = 0; i < n; i++) read(a[i]);
	for (int i = 0; i < m; i++) read(b[i]);
	int lim = init(n + m - 1), inv_lim = inv(lim);
	ntt(a, lim), ntt(b, lim);
	for (int i = 0; i < lim; i++) a[i] = (ll)a[i] * b[i] % mod;
	std::reverse(a + 1, a + lim), ntt(a, lim);
	for (int i = 0, l = n + m - 1; i < l; i++) print((ll)a[i] * inv_lim % mod, ' ');
}

} signed main() { return ringo::main(), 0; }

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #134.18 us52 KBAcceptedScore: 0

Subtask #1 Testcase #238.847 ms5 MB + 480 KBAcceptedScore: 100

Subtask #1 Testcase #311.637 ms2 MB + 332 KBAcceptedScore: 0

Subtask #1 Testcase #411.716 ms2 MB + 320 KBAcceptedScore: 0

Subtask #1 Testcase #535.36 us52 KBAcceptedScore: 0

Subtask #1 Testcase #634.66 us52 KBAcceptedScore: 0

Subtask #1 Testcase #734.14 us52 KBAcceptedScore: 0

Subtask #1 Testcase #835.551 ms5 MB + 212 KBAcceptedScore: 0

Subtask #1 Testcase #935.579 ms5 MB + 212 KBAcceptedScore: 0

Subtask #1 Testcase #1032.254 ms4 MB + 968 KBAcceptedScore: 0

Subtask #1 Testcase #1140.591 ms5 MB + 560 KBAcceptedScore: 0

Subtask #1 Testcase #1223.706 ms4 MB + 440 KBAcceptedScore: 0

Subtask #1 Testcase #1334.82 us52 KBAcceptedScore: 0


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