提交记录 5064


用户 题目 状态 得分 用时 内存 语言 代码长度
23forever 1002. 测测你的多项式乘法 Compile Error 0 0 ns 0 KB C++ 2.04 KB
提交时间 评测时间
2018-08-06 10:55:48 2020-08-01 00:10:07
#include <iostream>
#include <math.h>
#include <string.h>
#include <algorithm>
typedef long long LL;
const int MAXC = 7e6;
const int MAXN = 3e5;
const int MOD = 998244353;
const int G = 3;

int fastPow(LL b, int p) {
    int ret = 1;

    while (p) {
        if (p & 1) ret = ret % MOD * b % MOD;
        b = b % MOD * b % MOD;
          
        p >>= 1;
    }
  
    return ret % MOD;
}

int inv(int x) {
    return (fastPow(x, MOD - 2) + MOD) % MOD;
}

int N;

struct NumberTheoreticTransform {
    int omega[MAXN + 5], omegaInverse[MAXN + 5];
    int r[MAXN + 5], k;

    NumberTheoreticTransform() : k(0) {
        memset(r, 0, sizeof(r));
    }

    void init() {
        LL x = fastPow(G, (MOD - 1) / N);
        
        omega[0] = omegaInverse[0] = 1;
        for (int i = 1; i < N; ++i)
            omega[i] = omegaInverse[N - i] = omega[i - 1] * x % MOD;
        
        while ((1 << k) < N) 
            ++k;

        for (int i = 0; i < N; ++i) 
            r[i] = (r[i >> 1] >> 1) | ((i & 1) << (k - 1)); 
    }

    void operator()(unsigned *a, const int type) {
        for (int i = 0; i < N; ++i)
            if (i < r[i]) swap(a[i], a[r[i]]);

        for (int l = 2; l <= N; l <<= 1) {
            int m = l >> 1;

            for (int p = 0; p < N; p += l) 
                for (int i = 0; i < m; ++i) {
                    LL t = (type == 1 ? omega[N / l * i] : omegaInverse[N / l * i]) * a[p + i + m] % MOD;
                    a[p + i + m] = (a[p + i] - t + MOD) % MOD;
                    a[p + i] = (a[p + i] + t) % MOD;
                }
        }
        
        if (type == -1) {
            int x = inv(N);
            for (int i = 0; i < N; ++i)
                a[i] = a[i] * x % MOD;
        }
    }
}NTT;

void poly_multiply(unsigned *a, int n, unsigned *b, int m, unsigned *c) {
    ++n;
    ++m;

    N = 1;
    while (N <= n + m)
        N <<= 1;
    NTT.init();

    NTT(a, 1);
    NTT(b, 1);
    for (int i = 0; i < N; ++i)
        a[i] = LL(a[i] % MOD * a[i]) % MOD;
    
    NTT(a, -1);
    for (int i = 0; i < n + m - 1; ++i)
        c[i] = a[i];
}

CompilationN/AN/ACompile ErrorScore: N/A


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