提交记录 15071


用户 题目 状态 得分 用时 内存 语言 代码长度
dof 1002i. 【模板题】多项式乘法 Accepted 100 65.108 ms 7236 KB C++11 2.39 KB
提交时间 评测时间
2020-11-19 21:32:41 2020-11-19 21:32:46
#include <bits/stdc++.h>

using namespace std;

typedef vector<int> poly;

const int MOD = 998244353;
const int G = 3;

namespace Mod_math {
  inline int Add(int a, int b) {
    return (a += b) > MOD? a - MOD : a;
  }
  inline int Sub(int a, int b) {
    return (a -= b) < 0? a + MOD : a;
  }
  inline int Mul(int a, int b) {
    return (long long)a * b % MOD;
  }
  int Pow(int a, int b) {
    int t = 1;
    for (; b; b >>= 1) {
      if (b & 1) {
        t = Mul(t, a);
      }
      a = Mul(a, a);
    }
    return t;
  }
  int Inv(int x) {
    return Pow(x, MOD - 2);
  }
}

namespace Polynome {
  using namespace Mod_math;

  const int N = (1 << 19) + 5;
  
  int rev[N], w[N];

  void Init(const int L) {
    for (int i = 0; i < L; ++i) {
      rev[i] = rev[i >> 1] >> 1;
      if (i & 1) {
        rev[i] |= L >> 1;
      }
    }
    for (int l = 1; l < L; l <<= 1) {
      w[l] = 1;
      int wl = Pow(G, (MOD - 1) / 2 / l); // 2 * l long !!
      for (int i = l + 1; i < l * 2; ++i) {
        w[i] = Mul(w[i - 1], wl);
      }
    }
  }

  void Dft(poly &po, const int L) {
    for (int i = 0; i < L; ++i) {
      if (i < rev[i]) {
        swap(po[i], po[rev[i]]);
      }
    }
    int a, b, *wx, *l, *r;
    for (int k = 1; k < L; k *= 2) {
      for (int i = 0; i < L; i += k * 2) {
        l = &po[0] + i, r = l + k, wx = w + k;
        for (int j = 0; j < k; ++j) {
          a = *l;
          b = Mul(*wx, *r);
          *l = Add(a, b);
          *r = Sub(a, b);
          ++l, ++r, ++wx;
        }
      }
    }
  }

  void Idft(poly &po, const int L) {
    reverse(po.begin() + 1, po.end());
    Dft(po, L);
    int inv_l = Inv(L);
    for (int i = 0; i < L; ++i) {
      po[i] = Mul(po[i], inv_l);
    }
  }

  poly Multiply(poly f, poly g, int len = -1) {
    int n = f.size(), m = g.size(), l = 1;
    for (; l < n + m - 1; l <<= 1);
    Init(l);
    f.resize(l), Dft(f, l);
    g.resize(l), Dft(g, l);
    for (int i = 0; i < l; ++i) {
      f[i] = Mul(f[i], g[i]);
    }
    Idft(f, l);
    if (len == -1) {
      len = n + m - 1;
    }
    f.resize(len);
    return f;
  }
  
}

int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  ++n, ++m;
  poly f(n), g(m);
  for (int i = 0; i < n; ++i) {
    scanf("%d", &f[i]);
  }
  for (int i = 0; i < m; ++i) {
    scanf("%d", &g[i]);
  }
  f = Polynome::Multiply(f, g);
  for (int i = 0; i < f.size(); ++i) {
    printf("%d%c", f[i], " \n"[i == f.size() - 1]);
  }
  return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #139.66 us44 KBAcceptedScore: 0

Subtask #1 Testcase #264.855 ms6 MB + 1012 KBAcceptedScore: 0

Subtask #1 Testcase #330.197 ms3 MB + 88 KBAcceptedScore: 100

Subtask #1 Testcase #430.18 ms3 MB + 76 KBAcceptedScore: 0

Subtask #1 Testcase #540.89 us44 KBAcceptedScore: 0

Subtask #1 Testcase #639.22 us44 KBAcceptedScore: 0

Subtask #1 Testcase #738.84 us44 KBAcceptedScore: 0

Subtask #1 Testcase #857.3 ms6 MB + 476 KBAcceptedScore: 0

Subtask #1 Testcase #957.31 ms6 MB + 476 KBAcceptedScore: 0

Subtask #1 Testcase #1049.831 ms5 MB + 960 KBAcceptedScore: 0

Subtask #1 Testcase #1165.083 ms7 MB + 68 KBAcceptedScore: 0

Subtask #1 Testcase #1265.108 ms5 MB + 972 KBAcceptedScore: 0

Subtask #1 Testcase #1337.74 us44 KBAcceptedScore: 0


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