提交记录 49364


用户 题目 状态 得分 用时 内存 语言 代码长度
saffah_dsh_v41_0919 1002i. 【模板题】多项式乘法 Accepted 100 29.631 ms 5532 KB C++17 2.74 KB
提交时间 评测时间
2026-09-19 15:55:22 2026-09-19 15:56:10
// 1002i: polynomial multiply, n,m <= 1e5, coefficients < 10.
// NTT mod 998244353 (single prime suffices: c_k <= 81*100001 < 998244353).
#include <cstdio>
#include <cstring>
typedef unsigned u32;
typedef unsigned long long u64;
static const u32 MOD = 998244353;

static inline u32 fpow(u32 a, u32 e) {
    u64 r = 1, b = a;
    while (e) { if (e & 1) r = r * b % MOD; b = b * b % MOD; e >>= 1; }
    return (u32)r;
}

static u32 A[1 << 19], B[1 << 19];

static void ntt_dif(u32 *a, int n) {
    for (int len = n; len > 1; len >>= 1) {
        int half = len >> 1;
        u32 wlen = fpow(3, (MOD - 1) / len);
        for (int i = 0; i < n; i += len) {
            u32 w = 1;
            u32 *p = a + i, *q = a + i + half;
            for (int j = 0; j < half; j++) {
                u32 u = p[j], v = q[j];
                u32 s = u + v; if (s >= MOD) s -= MOD;
                u32 d = u >= v ? u - v : u - v + MOD;
                p[j] = s;
                q[j] = (u32)((u64)d * w % MOD);
                w = (u32)((u64)w * wlen % MOD);
            }
        }
    }
}

static void ntt_dit_inv(u32 *a, int n) {
    for (int len = 2; len <= n; len <<= 1) {
        int half = len >> 1;
        u32 wlen = fpow(3, MOD - 1 - (MOD - 1) / len);
        for (int i = 0; i < n; i += len) {
            u32 w = 1;
            u32 *p = a + i, *q = a + i + half;
            for (int j = 0; j < half; j++) {
                u32 u = p[j], v = (u32)((u64)q[j] * w % MOD);
                u32 s = u + v; if (s >= MOD) s -= MOD;
                u32 d = u >= v ? u - v : u - v + MOD;
                p[j] = s; q[j] = d;
                w = (u32)((u64)w * wlen % MOD);
            }
        }
    }
    u32 ninv = fpow((u32)n, MOD - 2);
    for (int i = 0; i < n; i++) A[i] = (u32)((u64)A[i] * ninv % MOD);
}

static inline int readInt(char *&p) {
    while (*p && (*p < '0' || *p > '9')) p++;
    int x = 0;
    while (*p >= '0' && *p <= '9') x = x * 10 + (*p++ - '0');
    return x;
}

int main() {
    static char buf[1 << 22];
    int len = (int)fread(buf, 1, sizeof(buf) - 1, stdin);
    buf[len] = 0;
    char *p = buf;
    int n = readInt(p), m = readInt(p);
    int N = 1; while (N < n + m + 1) N <<= 1;
    for (int i = 0; i <= n; i++) A[i] = readInt(p);
    for (int i = 0; i <= m; i++) B[i] = readInt(p);
    ntt_dif(A, N); ntt_dif(B, N);
    for (int i = 0; i < N; i++) A[i] = (u32)((u64)A[i] * B[i] % MOD);
    ntt_dit_inv(A, N);
    static char out[1 << 23];
    char *o = out;
    for (int i = 0; i <= n + m; i++) {
        u32 v = A[i];
        char tmp[12]; int t = 0;
        if (v == 0) tmp[t++] = '0';
        while (v) { tmp[t++] = char('0' + v % 10); v /= 10; }
        while (t) *o++ = tmp[--t];
        *o++ = i == n + m ? '\n' : ' ';
    }
    fwrite(out, 1, o - out, stdout);
    return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #19.91 us28 KBAcceptedScore: 100

Subtask #1 Testcase #229.544 ms5 MB + 248 KBAcceptedScore: 0

Subtask #1 Testcase #313.353 ms1 MB + 780 KBAcceptedScore: 0

Subtask #1 Testcase #413.411 ms1 MB + 760 KBAcceptedScore: 0

Subtask #1 Testcase #57.9 us28 KBAcceptedScore: 0

Subtask #1 Testcase #67.59 us28 KBAcceptedScore: 0

Subtask #1 Testcase #77.11 us28 KBAcceptedScore: 0

Subtask #1 Testcase #828.956 ms4 MB + 668 KBAcceptedScore: 0

Subtask #1 Testcase #928.99 ms4 MB + 668 KBAcceptedScore: 0

Subtask #1 Testcase #1028.423 ms4 MB + 68 KBAcceptedScore: 0

Subtask #1 Testcase #1129.631 ms5 MB + 412 KBAcceptedScore: 0

Subtask #1 Testcase #1227.322 ms3 MB + 168 KBAcceptedScore: 0

Subtask #1 Testcase #136.97 us28 KBAcceptedScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-09-23 12:07:05 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠