QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#417094#8721. 括号序列fragmentAC ✓107ms21780kbC++174.4kb2024-05-22 14:16:062024-05-22 14:16:06

Judging History

This is the latest submission verdict.

  • [2024-05-22 14:16:06]
  • Judged
  • Verdict: AC
  • Time: 107ms
  • Memory: 21780kb
  • [2024-05-22 14:16:06]
  • Submitted

answer

#include <bits/stdc++.h>
 
using namespace std;
 
const int N = 1 << 18, mod = 998244353, o = 18, len = 1 << o;
int n, f[N], g[N], iv[N];
 
int add(int x, int y) { return x + y < mod ? x + y : x + y - mod; }
int sub(int x, int y) { return x < y ? x + mod - y : x - y; }
 
int power(int a, int n) {
  int tp = 1;
  while (n) {
    if (n & 1)
      tp = 1ll * tp * a % mod;
    a = 1ll * a * a % mod, n >>= 1;
  }
  return tp;
}
 
namespace poly {
typedef unsigned long long u64;
int I[N], w[len], r[len], up, l;
 
void init() {
  I[0] = 1;
  const int wo = power(3, (mod - 1) >> o);
  w[len >> 1] = 1;
  for (int i = (len >> 1) + 1; i != len; i++)
    w[i] = 1ll * w[i - 1] * wo % mod;
  for (int i = (len >> 1) - 1; i; i--)
    w[i] = w[i << 1];
  for (int i = 0; i != len; i++)
    r[i] = (r[i >> 1] >> 1) | ((i & 1) << (o - 1));
}
 
void ntt(int *a, int n, bool op) {
  static u64 t[len], x, y;
  for (int i = 0; i != n; i += 2) {
    x = a[r[i] >> (o - l)], y = a[r[i + 1] >> (o - l)];
    t[i] = x + y, t[i + 1] = x + mod - y;
  }
  for (int l = 2; l != n; l <<= 1) {
    if (l == (1 << 18))
      for (u64 *f = t; f != t + n; f++)
        *f %= mod;
    int *k = w + l;
    for (u64 *f = t; f != t + n; f += l)
      for (int *j = k; j != k + l; j++, f++) {
        u64 x = *f, y = f[l] * *j % mod;
        f[l] = x + mod - y, *f += y;
      }
  }
  if (op) {
    if (n == (1 << 18))
      for (u64 *f = t; f != t + n; f++)
        *f %= mod;
    for (int i = 0, x = mod - (mod >> l); i != n; i++)
      a[i] = t[i] * x % mod;
    reverse(a + 1, a + n);
  } else
    for (int i = 0; i != n; i++)
      a[i] = t[i] % mod;
}
 
int pre(int n) {
  l = 32 - __builtin_clz(n);
  return up = 1 << l;
}
 
void inv(int *a, int n, int *f) {
  static int x[len], y[len];
  if (n <= 16) {
    int x = f[0] = power(a[0], mod - 2);
    for (int i = 1; i <= n; i++) {
      u64 s = 0;
      for (int j = 0; j != i; j++)
        s += 1ll * f[j] * a[i - j];
      f[i] = (mod - s % mod) * x % mod;
    }
    return;
  }
 
  int lt = n >> 1;
  inv(a, lt, f);
  memcpy(x, f, (lt + 1) << 2), memcpy(y, a, (n + 1) << 2);
  pre(n);
  ntt(x, up, 0), ntt(y, up, 0);
  for (int i = 0; i != up; i++)
    y[i] = 1ll * y[i] * x[i] % mod;
  ntt(y, up, 1);
  memset(y, 0, (lt + 1) << 2);
  ntt(y, up, 0);
  for (int i = 0; i != up; i++)
    y[i] = 1ll * y[i] * x[i] % mod;
  ntt(y, up, 1);
  for (int i = lt + 1; i <= n; i++)
    f[i] = sub(0, y[i]);
  memset(x, 0, up << 2), memset(y, 0, up << 2);
}
 
vector<int> v[N];
 
void solve(int l, int r) {
  static int x[len];
  if (r - l <= 16) {
    for (int i = l; i != r; i++) {
      if (i == 0) {
        continue;
      }
      if (i == 1) {
        f[i] = 1;
        continue;
      }
      f[i] = (f[i] + 2ll * (i - 1) * f[i - 1] % mod * iv[i]) % mod;
      u64 s = 0;
      for (int j = l; j != i; j++) {
        s += (u64)f[j] * f[i - j];
      }
      s %= mod;
      if (l) {
        s *= 2;
      }
      f[i] = (f[i] + s) * iv[2] % mod;
    }
    return;
  }
 
  int mid = (l + r) >> 1;
  solve(l, mid);
  if (mid > n) {
    return;
  }
 
  pre(r - l - 1);
  int up = r - l;
  if (l == 0) {
    memcpy(x, f, mid << 2);
    poly::ntt(x, up, 0);
    v[up / 2].resize(up / 2);
    for (int i = 0; i != up / 2; i++) {
      v[up / 2][i] = x[i * 2];
    }
    for (int i = 0; i != up; i++) {
      x[i] = 1ll * x[i] * x[i] % mod;
    }
    poly::ntt(x, up, 1);
    for (int i = mid; i != r; i++) {
      f[i] = add(f[i], x[i]);
    }
    memset(x, 0, up << 2);
  } else {
    memcpy(x, f + l, up << 1);
    poly::ntt(x, up, 0);
    for (int i = 0; i != up; i++) {
      x[i] = 2ll * x[i] * v[up][i] % mod;
    }
    poly::ntt(x, up, 1);
    for (int i = mid; i != r; i++) {
      f[i] = add(f[i], x[i - l]);
    }
    memset(x, 0, up << 2);
  }
  solve(mid, r);
}
 
void calc(int n) {
  int m = 1;
  while (m <= n) {
    m <<= 1;
  }
  solve(0, m);
}
}  // namespace poly
 
int main() {
  cin >> n, poly::init();
  f[1] = iv[1] = 1;
  for (int i = 2; i <= n; i++) {
    int j = mod / i + 1;
    iv[i] = 1ll * j * iv[i * j - mod] % mod;
  }
 
  poly::calc(n);
 
  f[0] = 1;
  for (int i = 1; i <= n; i++) {
    f[i] = mod - f[i];
  }
  poly::inv(f, n, g);
  int ans = g[n];
  for (int i = 1; i <= n; i++) {
    ans = 1ll * ans * i % mod;
  }
  cout << ans << endl;
}

这程序好像有点Bug,我给组数据试试?

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 17612kb

input:

3

output:

28

result:

ok 1 number(s): "28"

Test #2:

score: 0
Accepted
time: 0ms
memory: 16344kb

input:

1

output:

1

result:

ok 1 number(s): "1"

Test #3:

score: 0
Accepted
time: 3ms
memory: 16860kb

input:

2

output:

4

result:

ok 1 number(s): "4"

Test #4:

score: 0
Accepted
time: 3ms
memory: 16644kb

input:

4

output:

282

result:

ok 1 number(s): "282"

Test #5:

score: 0
Accepted
time: 4ms
memory: 16056kb

input:

5

output:

3718

result:

ok 1 number(s): "3718"

Test #6:

score: 0
Accepted
time: 3ms
memory: 17412kb

input:

6

output:

60694

result:

ok 1 number(s): "60694"

Test #7:

score: 0
Accepted
time: 4ms
memory: 17456kb

input:

7

output:

1182522

result:

ok 1 number(s): "1182522"

Test #8:

score: 0
Accepted
time: 3ms
memory: 17268kb

input:

8

output:

26791738

result:

ok 1 number(s): "26791738"

Test #9:

score: 0
Accepted
time: 3ms
memory: 17960kb

input:

9

output:

692310518

result:

ok 1 number(s): "692310518"

Test #10:

score: 0
Accepted
time: 0ms
memory: 17648kb

input:

10

output:

135061370

result:

ok 1 number(s): "135061370"

Test #11:

score: 0
Accepted
time: 4ms
memory: 19184kb

input:

100

output:

423669705

result:

ok 1 number(s): "423669705"

Test #12:

score: 0
Accepted
time: 0ms
memory: 19880kb

input:

1234

output:

878522960

result:

ok 1 number(s): "878522960"

Test #13:

score: 0
Accepted
time: 19ms
memory: 21144kb

input:

54321

output:

827950477

result:

ok 1 number(s): "827950477"

Test #14:

score: 0
Accepted
time: 37ms
memory: 20232kb

input:

65536

output:

380835743

result:

ok 1 number(s): "380835743"

Test #15:

score: 0
Accepted
time: 75ms
memory: 21684kb

input:

131072

output:

842796122

result:

ok 1 number(s): "842796122"

Test #16:

score: 0
Accepted
time: 49ms
memory: 20168kb

input:

131071

output:

981021531

result:

ok 1 number(s): "981021531"

Test #17:

score: 0
Accepted
time: 47ms
memory: 20184kb

input:

131070

output:

480197639

result:

ok 1 number(s): "480197639"

Test #18:

score: 0
Accepted
time: 81ms
memory: 21780kb

input:

131074

output:

383000585

result:

ok 1 number(s): "383000585"

Test #19:

score: 0
Accepted
time: 76ms
memory: 21748kb

input:

131073

output:

316664839

result:

ok 1 number(s): "316664839"

Test #20:

score: 0
Accepted
time: 103ms
memory: 21768kb

input:

250000

output:

119658643

result:

ok 1 number(s): "119658643"

Test #21:

score: 0
Accepted
time: 100ms
memory: 21780kb

input:

249999

output:

78110138

result:

ok 1 number(s): "78110138"

Test #22:

score: 0
Accepted
time: 107ms
memory: 21744kb

input:

249998

output:

297253469

result:

ok 1 number(s): "297253469"

Extra Test:

score: 0
Extra Test Passed