QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#956070#8721. 括号序列Andyqian7TL 1349ms22868kbC++234.4kb2025-03-29 17:18:192025-03-29 17:18:19

Judging History

This is the latest submission verdict.

  • [2025-03-29 17:18:19]
  • Judged
  • Verdict: TL
  • Time: 1349ms
  • Memory: 22868kb
  • [2025-03-29 17:18:19]
  • Submitted

answer

#include <bits/stdc++.h>
#define ll long long
#define poly vector<int>
using namespace std;
const int N = 1e6 + 10, P = 998244353;
inline int ksm(int a, int b, int mod)
{
    int z = 1;
    while (b)
    {
        if (b & 1)
            z = 1ll * z * a % mod;
        a = 1ll * a * a % mod;
        b >>= 1;
    }
    return z;
}
namespace Poly
{
    const int mod = 998244353, g = 3, invg = 332748118;
    int lim, len, rev[N], invlim;
    inline void init(int l1, int l2)
    {
        lim = 1, len = 0;
        while (lim <= l1 + l2)
            lim <<= 1, len++;
        for (int i = 0; i < lim; i++)
            rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (len - 1));
        invlim = ksm(lim, mod - 2, mod);
    }
    inline void NTT(poly &f, int tgpe)
    {
        for (int i = 0; i < lim; i++)
            if (i < rev[i])
                swap(f[i], f[rev[i]]);
        for (int m = 2; m <= lim; m <<= 1)
        {
            int wn = ksm(tgpe ? g : invg, (mod - 1) / m, mod);
            for (int i = 0; i < lim; i += m)
            {
                int w = 1;
                for (int j = 0; j < m / 2; j++)
                {
                    int u = f[i + j], v = 1ll * w * f[i + j + m / 2] % mod;
                    f[i + j] = (u + v >= mod ? u + v - mod : u + v), f[i + j + m / 2] = (u - v + mod >= mod ? u - v : u - v + mod);
                    w = 1ll * wn * w % mod;
                }
            }
        }
        if (!tgpe)
        {
            for (int i = 0; i < lim; i++)
                f[i] = 1ll * f[i] * invlim % mod;
        }
    }
    inline void mul(poly &f, poly g)
    {
        int lf = f.size(), lg = g.size();
        init(lf, lg);
        f.resize(lim), g.resize(lim);
        NTT(f, 1);
        NTT(g, 1);
        for (int i = 0; i < lim; i++)
            f[i] = 1ll * f[i] * g[i] % mod;
        NTT(f, 0);
    }
}
int n;
poly f, g;
poly A, B;
int fac[N], ifac[N], inv[N];
void cdq(int l, int r)
{
    if (l == r)
    {
        if (!l)
            g[l] = 1;
        else if (l == 1)
            g[l] = P - 2;
        if (l && l < n)
        {
            g[l + 1] = (g[l + 1] + 1ll * (P - g[l]) * inv[l + 1]) % P;
        }
        return;
    }
    int mid = l + r >> 1;
    cdq(l, mid);
    if (!l)
    {
        A.resize(mid - l + 1);
        B.resize(mid - l + 1);
        for (int i = l; i <= mid; i++)
            A[i - l] = 1ll * g[i] * i % P;
        for (int i = 0; i <= mid; i++)
            B[i] = g[i];
        Poly::mul(A, B);
        for (int i = mid + 1; i <= r; i++)
            g[i] = (g[i] + 1ll * (P - A[i - l]) * inv[i]) % P;
    }
    else
    {
        A.resize(mid - l + 1);
        B.resize(r - l + 1);
        for (int i = l; i <= mid; i++)
            A[i - l] = 1ll * g[i] * i % P;
        for (int i = 0; i <= r - l; i++)
            B[i] = g[i];
        Poly::mul(A, B);
        for (int i = mid + 1; i <= r; i++)
            g[i] = (g[i] + 1ll * (P - A[i - l]) * inv[i]) % P;
        A.resize(mid - l + 1);
        B.resize(r - l + 1);
        for (int i = l; i <= mid; i++)
            A[i - l] = g[i];
        for (int i = 0; i <= r - l; i++)
            B[i] = 1ll * i * g[i] % P;
        Poly::mul(A, B);
        for (int i = mid + 1; i <= r; i++)
            g[i] = (g[i] + 1ll * (P - A[i - l]) * inv[i]) % P;
    }
    cdq(mid + 1, r);
}
void cdq2(int l, int r)
{
    if (l == r)
    {
        if (!l)
            f[l] = 1;
        return;
    }
    int mid = l + r >> 1;
    cdq2(l, mid);
    A.resize(mid - l + 1);
    B.resize(r - l + 1);
    for (int i = l; i <= mid; i++)
        A[i - l] = f[i];
    for (int i = 0; i <= r - l; i++)
        B[i] = g[i];
    Poly::mul(A, B);
    for (int i = mid + 1; i <= r; i++)
        f[i] = (f[i] + A[i - l]) % P;
    cdq2(mid + 1, r);
}
int main()
{
    fac[0] = fac[1] = inv[1] = ifac[0] = ifac[1] = 1;
    for (int i = 2; i < N; i++)
    {
        fac[i] = 1ll * fac[i - 1] * i % P;
        inv[i] = 1ll * (P - P / i) * inv[P % i] % P;
        ifac[i] = 1ll * ifac[i - 1] * inv[i] % P;
    }
    scanf("%d", &n);
    g.resize(n + 1), f.resize(n + 1);
    cdq(0, n);
    int sum = g[n - 1];
    for (int i = 0; i < n; i++)
    {
        sum = (sum + (i + 1ll) * g[i + 1] % P * g[n - 1 - i]) % P;
    }
    for (int i = 0; i <= n; i++)
    {
        g[i] = P - g[i];
    }
    g[0] = 0, g[1] = 1;
    cdq2(0, n);
    printf("%d", 1ll * f[n] * fac[n] % P);
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 7ms
memory: 17536kb

input:

3

output:

28

result:

ok 1 number(s): "28"

Test #2:

score: 0
Accepted
time: 8ms
memory: 17300kb

input:

1

output:

1

result:

ok 1 number(s): "1"

Test #3:

score: 0
Accepted
time: 8ms
memory: 16160kb

input:

2

output:

4

result:

ok 1 number(s): "4"

Test #4:

score: 0
Accepted
time: 7ms
memory: 16900kb

input:

4

output:

282

result:

ok 1 number(s): "282"

Test #5:

score: 0
Accepted
time: 6ms
memory: 17400kb

input:

5

output:

3718

result:

ok 1 number(s): "3718"

Test #6:

score: 0
Accepted
time: 8ms
memory: 15928kb

input:

6

output:

60694

result:

ok 1 number(s): "60694"

Test #7:

score: 0
Accepted
time: 6ms
memory: 16128kb

input:

7

output:

1182522

result:

ok 1 number(s): "1182522"

Test #8:

score: 0
Accepted
time: 7ms
memory: 16348kb

input:

8

output:

26791738

result:

ok 1 number(s): "26791738"

Test #9:

score: 0
Accepted
time: 7ms
memory: 15860kb

input:

9

output:

692310518

result:

ok 1 number(s): "692310518"

Test #10:

score: 0
Accepted
time: 7ms
memory: 15748kb

input:

10

output:

135061370

result:

ok 1 number(s): "135061370"

Test #11:

score: 0
Accepted
time: 7ms
memory: 17180kb

input:

100

output:

423669705

result:

ok 1 number(s): "423669705"

Test #12:

score: 0
Accepted
time: 13ms
memory: 17556kb

input:

1234

output:

878522960

result:

ok 1 number(s): "878522960"

Test #13:

score: 0
Accepted
time: 578ms
memory: 19504kb

input:

54321

output:

827950477

result:

ok 1 number(s): "827950477"

Test #14:

score: 0
Accepted
time: 633ms
memory: 19400kb

input:

65536

output:

380835743

result:

ok 1 number(s): "380835743"

Test #15:

score: 0
Accepted
time: 1346ms
memory: 22868kb

input:

131072

output:

842796122

result:

ok 1 number(s): "842796122"

Test #16:

score: 0
Accepted
time: 1340ms
memory: 21704kb

input:

131071

output:

981021531

result:

ok 1 number(s): "981021531"

Test #17:

score: 0
Accepted
time: 1349ms
memory: 21856kb

input:

131070

output:

480197639

result:

ok 1 number(s): "480197639"

Test #18:

score: 0
Accepted
time: 1345ms
memory: 22864kb

input:

131074

output:

383000585

result:

ok 1 number(s): "383000585"

Test #19:

score: 0
Accepted
time: 1346ms
memory: 21576kb

input:

131073

output:

316664839

result:

ok 1 number(s): "316664839"

Test #20:

score: -100
Time Limit Exceeded

input:

250000

output:


result: