提交记录 12376


用户 题目 状态 得分 用时 内存 语言 代码长度
zhengjiarui 1002i. 【模板题】多项式乘法 Accepted 100 26.389 ms 7104 KB C++11 3.45 KB
提交时间 评测时间
2020-03-31 15:05:33 2020-08-01 02:54:39
#include <bits/stdc++.h>

#define IL inline
#define CT const
#define RG register
#define TT template <typename Ty>

namespace io {
const int MaxBuff = 1 << 24, MaxOut = 1 << 24;
char b[MaxBuff], *S = b, *T = b, buff[MaxOut], *iter = buff;
FILE *_IN = stdin, *_OUT = stdout;
IL char gc() { return S == T && (T = (S = b) + fread(b, 1, MaxBuff, _IN), S == T) ? 0 : *S++; }
IL void pc(const char s) { *iter++ = s; }
IL void fflush() { fwrite(buff, 1, iter - buff, _OUT), iter = buff, fclose(_IN), fclose(_OUT); }
} // namespace io

TT IL Ty max(CT Ty& a, CT Ty& b) { return a > b ? a : b; }
TT IL Ty min(CT Ty& a, CT Ty& b) { return a < b ? a : b; }
TT IL void cmax(Ty& a, CT Ty& b) { if (b > a) a = b; }
TT IL void cmin(Ty& a, CT Ty& b) { if (b < a) a = b; }
TT IL void swap(Ty& a, Ty& b) { Ty t = a; a = b; b = t; }
TT IL void swap(Ty*& a, Ty*& b) { Ty *t = a; a = b; b = t; }

TT IL void read(Ty& t) {
    t = 0; int f = 1; RG char ch = io::gc();
    while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = io::gc(); }
    do { t = t * 10 + ch - '0'; ch = io::gc(); } while (ch >= '0' && ch <= '9'); t *= f;
}

TT IL void write(Ty x) {
    if (x < 0) io::pc('-');
    if (x > 9) write(x / 10);
    io::pc(x % 10 + '0');
}

template <int N, int MOD> 
class NTT {
	public:
  void dit(int n, int *a) {
    for (int m = 1; m < n; m <<= 1) {
      int64_t root = power(G, (MOD - 1) / (m << 1));
      twiddles[0] = 1;
      for (int i = 1; i < m; ++i) {
        twiddles[i] = twiddles[i - 1] * root % MOD;
      }
      for (int i = 0; i < n; i += m << 1) {
        for (int r = i; r < i + m; ++r) {
          int tmp = static_cast<int64_t>(twiddles[r - i]) * a[r + m] % MOD;
          a[r + m] = a[r];
          add(a[r + m], MOD - tmp);
          add(a[r], tmp);
        }
      }
    }
  }

  void dif(int n, int *a) {
    for (int m = n; m >>= 1;) {
      int64_t root = power(G, MOD - 1 - (MOD - 1) / (m << 1));
      twiddles[0] = 1;
      for (int i = 1; i < m; ++i) {
        twiddles[i] = twiddles[i - 1] * root % MOD;
      }
      for (int i = 0; i < n; i += m << 1) {
        for (int r = i; r < i + m; ++r) {
          int tmp = a[r];
          add(tmp, MOD - a[r + m]);
          add(a[r], a[r + m]);
          a[r + m] = static_cast<int64_t>(twiddles[r - i]) * tmp % MOD;
        }
      }
    }
  }

  void convolute(int n, int *a, int *b, int *out) {
    dif(n, a);
    dif(n, b);
    unsigned long long inv_n = power(n, MOD - 2);
    for (int i = 0; i < n; ++i) {
      out[i] = inv_n * a[i] % MOD * b[i] % MOD;
    }
    dit(n, out);
  }

  static int power(int a, int n) {
    int res = 1;
    while (n) {
      if (n & 1) {
        res = 1ULL * res * a % MOD;
      }
      a = 1ULL * a * a % MOD;
      n >>= 1;
    }
    return res;
  }

  static void add(int &x, int a) {
    x += a;
    if (x >= MOD) {
      x -= MOD;
    }
  }

private:
  void revbin(int n, int *a) {
    for (int i = 1, j = 0; i < n - 1; ++i) {
      for (int s = n; j ^= s >>= 1, ~j & s;)
        ;
      if (i < j) {
        std::swap(a[i], a[j]);
      }
    }
  }

  static const int G = 3;
  int twiddles[N];
};

const int N = 1e6 + 5;
int n, m, a[N * 4], b[N * 4], c[N * 4];
NTT<N * 4, 998244353> ntt;

int main() {
    read(n), read(m); ++n, ++m;
    for (int i = 0; i < n; ++i) read(a[i]);
    for (int i = 0; i < m; ++i) read(b[i]);
    int n2 = 1;
  	while (m + n >= n2) n2 <<= 1;
		ntt.convolute(n2, a, b, c);
    for (int i = 0; i < n + m - 1; ++i) write(c[i]), io::pc(' ');
    io::pc('\n');
    io::fflush();
    return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #135.69 us60 KBAcceptedScore: 0

Subtask #1 Testcase #225.71 ms6 MB + 800 KBAcceptedScore: 100

Subtask #1 Testcase #310.389 ms2 MB + 560 KBAcceptedScore: 0

Subtask #1 Testcase #410.372 ms2 MB + 540 KBAcceptedScore: 0

Subtask #1 Testcase #536.48 us60 KBAcceptedScore: 0

Subtask #1 Testcase #636.29 us60 KBAcceptedScore: 0

Subtask #1 Testcase #736.15 us60 KBAcceptedScore: 0

Subtask #1 Testcase #824.59 ms6 MB + 192 KBAcceptedScore: 0

Subtask #1 Testcase #924.575 ms6 MB + 192 KBAcceptedScore: 0

Subtask #1 Testcase #1023.458 ms5 MB + 612 KBAcceptedScore: 0

Subtask #1 Testcase #1126.389 ms6 MB + 960 KBAcceptedScore: 0

Subtask #1 Testcase #1221.23 ms4 MB + 720 KBAcceptedScore: 0

Subtask #1 Testcase #1335.73 us60 KBAcceptedScore: 0


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