提交记录 17252


用户 题目 状态 得分 用时 内存 语言 代码长度
platelet 1002i. 【模板题】多项式乘法 Runtime Error 0 1.792 ms 3288 KB C++ 5.07 KB
提交时间 评测时间
2022-01-05 21:56:56 2022-01-05 21:57:01
#include <bits/stdc++.h>
#include <immintrin.h>
#pragma GCC target("avx512f")

using namespace std;
using uint = unsigned int;
using ull = unsigned long long;

int read() {
    const int M = 1e6;
    static streambuf* in = cin.rdbuf();
    #define gc (p1 == p2 && (p2 = (p1 = buf) + in -> sgetn(buf, M), p1 == p2) ? -1 : *p1++)
    static char buf[M], *p1, *p2;
    int c = gc;
    while(c < 48) c = gc;
    return c & 15;
}
void wrt(int x) {
    static streambuf* out = cout.rdbuf();
    #define pc out -> sputc
    static char c[11]; int sz = 0;
    do c[++sz] = x % 10, x /= 10; while(x);
    while(sz) pc(c[sz--] + 48);
    pc(32);
}

const uint M = 998244353;

int n, m, lim = 16, rev[1 << 18];
uint w[1 << 18];
__m512i a[1 << 14], b[1 << 14];

const auto A = (uint*)a, B = (uint*)b;

uint Pow(uint a, int n, uint r = 1) {
    for(; n; n >>= 1, a = (ull)a * a % M)
    if(n & 1) r = (ull)r * a % M;
    return r;
}
void NTT(__m512i a[], int t) {
    const auto _M = _mm512_set1_epi32(M);
    auto A = (uint*)a;
    for(int i = 0; i < lim; i++) if(rev[i] < i) swap(A[i], A[rev[i]]);
    uint tmp, x, y;
    for(int j = 0; j < lim; j += 2) {
        x = A[j + 0], tmp = y = (ull)A[j + 1] * w[1] % M;
        y = x - y, x += tmp;
        A[j + 0] = x < M ? x : x - M, A[j + 1] = y < M ? y : y + M;
    }
    for(int j = 0; j < lim; j += 4) {
        x = A[j + 0], tmp = y = (ull)A[j + 2] * w[2] % M;
        y = x - y, x += tmp;
        A[j + 0] = x < M ? x : x - M, A[j + 2] = y < M ? y : y + M;
        x = A[j + 1], tmp = y = (ull)A[j + 3] * w[3] % M;
        y = x - y, x += tmp;
        A[j + 1] = x < M ? x : x - M, A[j + 3] = y < M ? y : y + M;
    }
    for(int j = 0; j < lim; j += 8) {
        x = A[j + 0], tmp = y = (ull)A[j + 4] * w[4] % M;
        y = x - y, x += tmp;
        A[j + 0] = x < M ? x : x - M, A[j + 4] = y < M ? y : y + M;
        x = A[j + 1], tmp = y = (ull)A[j + 5] * w[5] % M;
        y = x - y, x += tmp;
        A[j + 1] = x < M ? x : x - M, A[j + 5] = y < M ? y : y + M;
        x = A[j + 2], tmp = y = (ull)A[j + 6] * w[6] % M;
        y = x - y, x += tmp;
        A[j + 2] = x < M ? x : x - M, A[j + 6] = y < M ? y : y + M;
        x = A[j + 3], tmp = y = (ull)A[j + 7] * w[7] % M;
        y = x - y, x += tmp;
        A[j + 3] = x < M ? x : x - M, A[j + 7] = y < M ? y : y + M;
    }
    for(int j = 0; j < lim; j += 16) {
        x = A[j + 0], tmp = y = (ull)A[j + 8] * w[8] % M;
        y = x - y, x += tmp;
        A[j + 0] = x < M ? x : x - M, A[j + 8] = y < M ? y : y + M;
        x = A[j + 1], tmp = y = (ull)A[j + 9] * w[9] % M;
        y = x - y, x += tmp;
        A[j + 1] = x < M ? x : x - M, A[j + 9] = y < M ? y : y + M;
        x = A[j + 2], tmp = y = (ull)A[j + 10] * w[10] % M;
        y = x - y, x += tmp;
        A[j + 2] = x < M ? x : x - M, A[j + 10] = y < M ? y : y + M;
        x = A[j + 3], tmp = y = (ull)A[j + 11] * w[11] % M;
        y = x - y, x += tmp;
        A[j + 3] = x < M ? x : x - M, A[j + 11] = y < M ? y : y + M;
        x = A[j + 4], tmp = y = (ull)A[j + 12] * w[12] % M;
        y = x - y, x += tmp;
        A[j + 4] = x < M ? x : x - M, A[j + 12] = y < M ? y : y + M;
        x = A[j + 5], tmp = y = (ull)A[j + 13] * w[13] % M;
        y = x - y, x += tmp;
        A[j + 5] = x < M ? x : x - M, A[j + 13] = y < M ? y : y + M;
        x = A[j + 6], tmp = y = (ull)A[j + 14] * w[14] % M;
        y = x - y, x += tmp;
        A[j + 6] = x < M ? x : x - M, A[j + 14] = y < M ? y : y + M;
        x = A[j + 7], tmp = y = (ull)A[j + 15] * w[15] % M;
        y = x - y, x += tmp;
        A[j + 7] = x < M ? x : x - M, A[j + 15] = y < M ? y : y + M;
    }
    lim >>= 4;
    for(int i = 1; i < lim; i <<= 1) {
        for(int j = i; j < lim; j += i << 1)
            for(int k = 0; k < i; k++) {
                uint *y = (uint*)(a + j + k), *z = w + (i + k << 4);
                #define Mul(i) y[i] = (ull)y[i] * z[i] % M
                Mul(0), Mul(1), Mul(2), Mul(3), Mul(4), Mul(5), Mul(6), Mul(7);
                Mul(8), Mul(9), Mul(10), Mul(11), Mul(12), Mul(13), Mul(14), Mul(15);
            }
        for(int j = 0; j < lim; j += i << 1)
            for(int k = j; k < j + i; k++) {
                __m512i &x = a[k], &y = a[k + i], t = y;
                #define Min _mm512_min_epu32
                #define Add _mm512_add_epi32
                #define Sub _mm512_sub_epi32
                y = Sub(x, y), y = Min(y, Add(y, _M));
                x = Add(x, t), x = Min(x, Sub(x, _M));
            }
    }
    lim <<= 4;
    if(t) reverse(A + 1, A + lim);
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for(int i = 0; i <= n; i++) A[i] = read();
    for(int i = 0; i <= m; i++) B[i] = read();
    while(lim <= n + m) lim <<= 1;
    for(int i = 0; i < lim; i++) rev[i] = rev[i >> 1] >> 1 | (i & 1 ? lim >> 1 : 0);
    for(int i = 1; i < lim; i <<= 1) {
        ull wn = Pow(3, M / 2 / i);
        for(int j = 0; j < i; j++) w[i + j] = j ? w[i + j - 1] * wn % M : 1;
    }
    NTT(a, 0), NTT(b, 0);
    for(int i = 0; i < lim; i++) A[i] = (ull)A[i] * B[i] % M;
    NTT(a, 1);
    ull inv = Pow(lim, M - 2);
    for(int i = 0; i <= n + m; i++) wrt(A[i] * inv % M);
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #138.48 us76 KBRuntime ErrorScore: 0

Subtask #1 Testcase #21.792 ms3 MB + 216 KBRuntime ErrorScore: 0

Subtask #1 Testcase #3930.71 us1 MB + 664 KBRuntime ErrorScore: 0

Subtask #1 Testcase #4903.51 us1 MB + 664 KBRuntime ErrorScore: 0

Subtask #1 Testcase #541.29 us76 KBRuntime ErrorScore: 0

Subtask #1 Testcase #638.31 us76 KBRuntime ErrorScore: 0

Subtask #1 Testcase #739.29 us76 KBRuntime ErrorScore: 0

Subtask #1 Testcase #81.695 ms3 MB + 16 KBRuntime ErrorScore: 0

Subtask #1 Testcase #91.686 ms3 MB + 16 KBRuntime ErrorScore: 0

Subtask #1 Testcase #101.598 ms2 MB + 840 KBRuntime ErrorScore: 0

Subtask #1 Testcase #111.787 ms3 MB + 216 KBRuntime ErrorScore: 0

Subtask #1 Testcase #121.785 ms3 MB + 216 KBRuntime ErrorScore: 0

Subtask #1 Testcase #1339.48 us76 KBRuntime ErrorScore: 0


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