QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#956070 | #8721. 括号序列 | Andyqian7 | TL | 1349ms | 22868kb | C++23 | 4.4kb | 2025-03-29 17:18:19 | 2025-03-29 17:18:19 |
Judging History
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