QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#397568 | #8010. Hierarchies of Judges | chhokmah | AC ✓ | 2892ms | 61764kb | C++23 | 6.7kb | 2024-04-24 13:10:01 | 2024-04-24 13:10:01 |
Judging History
answer
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
void io() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
typedef long long ll;
typedef unsigned long long ull;
const int MAXN = 4e5 + 5;
const ll INF = 0x3f3f3f3f3f3f3f;
const ll MOD = 998244353;
const int inv2 = (MOD + 1) >> 1;
typedef vector<int> Poly;
int inc(int a, int b) { return (a += b) >= MOD ? a - MOD : a; }
int fpow(int a, int b) {
int t = 1;
while (b) {
if (b & 1) {
t = 1LL * t * a % MOD;
}
a = 1LL * a * a % MOD;
b >>= 1;
}
return t;
}
int W[MAXN * 4], inv[MAXN * 4];
// 预处理原根,以及线性求逆元
void prework(int n) {
for (int i = 1; i < n; i <<= 1) {
for (int j = W[i] = 1, Wn = fpow(3, (MOD - 1) / i >> 1); j < i; j++) {
W[i + j] = 1LL * W[i + j - 1] * Wn % MOD;
}
}
inv[1] = 1;
for (int i = 2; i <= n; i++) {
inv[i] = 1LL * (MOD - MOD / i) * inv[MOD % i] % MOD;
}
}
void fft(Poly &a, int n, int opt) {
a.resize(n);
static int rev[MAXN * 4];
for (int i = 1; i < n; i++) {
if ((rev[i] = rev[i >> 1] >> 1 | (i & 1 ? n >> 1 : 0)) > i) {
swap(a[i], a[rev[i]]);
}
}
for (int q = 1; q < n; q <<= 1) {
for (int p = 0; p < n; p += q << 1) {
for (int i = 0, t; i < q; i++) {
t = 1LL * W[q + i] * a[p + q + i] % MOD;
a[p + q + i] = inc(a[p + i], MOD - t);
a[p + i] = inc(a[p + i], t);
}
}
}
if (opt) {
return;
}
for (int i = 0, inv = fpow(n, MOD - 2); i < n; i++) {
a[i] = 1LL * a[i] * inv % MOD;
}
reverse(a.begin() + 1, a.end());
}
Poly poly_inv(Poly A) {
Poly B(1, fpow(A[0], MOD - 2)), C(2);
for (int L = 1; L < A.size(); L <<= 1) {
(C = A).resize(L * 2);
fft(B, L * 4, 1), fft(C, L * 4, 1);
for (int i = 0; i < L * 4; i++) {
B[i] =
(2 * B[i] - 1LL * B[i] * B[i] % MOD * C[i] % MOD + MOD) % MOD;
}
fft(B, L * 4, 0);
B.resize(L * 2);
}
return B.resize(A.size()), B;
}
int getsz(int n) {
int x = 1;
while (x < n) {
x <<= 1;
}
return x;
}
void fix(Poly &A) {
int x = A.size();
while (x > 1 && !A[x - 1]) {
x--;
}
A.resize(x);
}
Poly operator+(Poly A, Poly B) {
if (A.size() < B.size()) {
swap(A, B);
}
for (int i = 0; i < B.size(); i++) {
A[i] = inc(A[i], B[i]);
}
return fix(A), A;
}
Poly operator-(Poly A, Poly B) {
A.resize(max(A.size(), B.size()));
for (int i = 0; i < B.size(); i++) {
A[i] = inc(A[i], MOD - B[i]);
}
return fix(A), A;
}
Poly operator*(int k, Poly A) {
for (int i = 0; i < A.size(); i++) {
A[i] = 1LL * k * A[i] % MOD;
}
return A;
}
Poly operator*(Poly A, Poly B) {
int L = getsz(A.size() + B.size() - 1);
fft(A, L, 1), fft(B, L, 1);
for (int i = 0; i < L; i++) {
A[i] = 1LL * A[i] * B[i] % MOD;
}
return fft(A, L, 0), fix(A), A;
}
// 需要有 A.size() >= B.size()
Poly operator/(Poly A, Poly B) {
int n = A.size() - B.size() + 1;
reverse(A.begin(), A.end());
A.resize(n);
reverse(B.begin(), B.end());
B.resize(n);
return A = A * poly_inv(B), A.resize(n), reverse(A.begin(), A.end()),
fix(A), A;
}
Poly operator>>(Poly A, int k) {
A.resize(A.size() + 1);
for (int i = A.size() - 1; i > 0; i--) {
A[i] = A[i - 1];
}
A[0] = 0;
return A;
}
Poly operator%(Poly A, Poly B) {
if (A.size() < B.size()) {
return A;
}
return A - A / B * B;
}
Poly poly_deri(Poly A) {
for (int i = 0; i < A.size() - 1; i++) {
A[i] = 1LL * (i + 1) * A[i + 1] % MOD;
}
return A.resize(A.size() - 1), A;
}
Poly poly_int(Poly A) {
for (int i = A.size() - 1; i; i--) {
A[i] = 1LL * A[i - 1] * inv[i] % MOD;
}
return A[0] = 0, A;
}
Poly poly_sqrt(Poly A) {
Poly B(1, 1), iB, C(2);
for (int L = 1; L < A.size(); L <<= 1) {
(C = A).resize(L * 2);
B.resize(L * 2);
iB = poly_inv(B);
fft(B, L * 4, 1), fft(iB, L * 4, 1), fft(C, L * 4, 1);
for (int i = 0; i < L * 4; i++) {
B[i] = (1LL * B[i] * B[i] + C[i]) % MOD * iB[i] % MOD * inv2 % MOD;
}
fft(B, L * 4, 0);
B.resize(L * 2);
}
return B.resize(A.size()), B;
}
Poly poly_ln(Poly A) {
Poly B = poly_deri(A) * poly_inv(A);
return B.resize(A.size()), poly_int(B);
}
Poly poly_exp(Poly A) {
Poly B(1, 1), C;
for (int L = 1; L < A.size(); L <<= 1) {
B.resize(L * 2);
C = A + Poly(1, 1) - poly_ln(B), C.resize(L * 2);
B = B * C;
}
return B.resize(A.size()), B;
}
Poly poly_pow(Poly A, int k) { return poly_exp(k * poly_ln(A)); }
pair<Poly, Poly> newton(int n, Poly B, Poly W) {
Poly WW, BW, xeB, xeBW;
Poly xeBW_B, xeBW_BWW;
Poly xeBW_W, xeBW_WW, xeBW_WWW;
Poly f0, g0, fB, fW, gB, gW;
Poly x, y;
Poly det_inv;
for (int L = 1; L <= n; L <<= 1) {
WW = W * W;
BW = B * W;
B.resize(2 * L);
xeB = poly_exp(B) >> 1;
fix(B);
xeBW = poly_exp(BW) >> 1;
xeBW_B = xeBW * B;
xeBW_B.resize(2 * L);
xeBW_BWW = xeBW_B * WW;
xeBW_BWW.resize(2 * L);
xeBW_W = xeBW * W;
xeBW_W.resize(2 * L);
xeBW_WW = xeBW_W * W;
xeBW_WW.resize(2 * L);
xeBW_WWW = xeBW_WW * W;
xeBW_WWW.resize(2 * L);
f0 = B - BW - xeB + xeBW_WW;
g0 = W - WW - xeB + xeBW;
fB = xeBW_WWW - W - xeB;
fB[0] = (fB[0] + 1) % MOD;
fW = xeBW_BWW + 2 * xeBW_W - B;
gB = xeBW_W - xeB;
gW = xeBW_B - 2 * W;
gW[0] = (gW[0] + 1) % MOD;
x = B * fB + W * fW - f0;
x.resize(2 * L);
y = B * gB + W * gW - g0;
y.resize(2 * L);
det_inv = fB * gW - fW * gB;
det_inv.resize(2 * L);
det_inv = poly_inv(det_inv);
B = x * gW - y * fW;
B.resize(2 * L);
B = B * det_inv;
B.resize(2 * L);
W = y * fB - x * gB;
W.resize(2 * L);
W = W * det_inv;
W.resize(2 * L);
}
return {B, W};
}
int main() {
io();
prework(getsz(MAXN) * 2);
int n;
cin >> n;
auto [B, W] = newton(n, {0}, {0});
int fac_n = 1;
for (int i = 1; i <= n; i++) {
fac_n = (ll)fac_n * i % MOD;
}
cout << (ll)(B[n] + W[n]) * fac_n % MOD;
}
这程序好像有点Bug,我给组数据试试?
詳細信息
Test #1:
score: 100
Accepted
time: 15ms
memory: 11848kb
input:
1
output:
1
result:
ok 1 number(s): "1"
Test #2:
score: 0
Accepted
time: 11ms
memory: 12084kb
input:
3
output:
24
result:
ok 1 number(s): "24"
Test #3:
score: 0
Accepted
time: 7ms
memory: 12080kb
input:
5
output:
3190
result:
ok 1 number(s): "3190"
Test #4:
score: 0
Accepted
time: 10ms
memory: 11896kb
input:
100
output:
413875584
result:
ok 1 number(s): "413875584"
Test #5:
score: 0
Accepted
time: 7ms
memory: 11784kb
input:
1
output:
1
result:
ok 1 number(s): "1"
Test #6:
score: 0
Accepted
time: 7ms
memory: 11884kb
input:
2
output:
4
result:
ok 1 number(s): "4"
Test #7:
score: 0
Accepted
time: 14ms
memory: 12016kb
input:
3
output:
24
result:
ok 1 number(s): "24"
Test #8:
score: 0
Accepted
time: 11ms
memory: 11784kb
input:
4
output:
236
result:
ok 1 number(s): "236"
Test #9:
score: 0
Accepted
time: 7ms
memory: 12096kb
input:
5
output:
3190
result:
ok 1 number(s): "3190"
Test #10:
score: 0
Accepted
time: 15ms
memory: 11820kb
input:
6
output:
55182
result:
ok 1 number(s): "55182"
Test #11:
score: 0
Accepted
time: 15ms
memory: 12096kb
input:
7
output:
1165220
result:
ok 1 number(s): "1165220"
Test #12:
score: 0
Accepted
time: 15ms
memory: 12024kb
input:
8
output:
29013896
result:
ok 1 number(s): "29013896"
Test #13:
score: 0
Accepted
time: 11ms
memory: 11864kb
input:
9
output:
832517514
result:
ok 1 number(s): "832517514"
Test #14:
score: 0
Accepted
time: 14ms
memory: 11756kb
input:
10
output:
96547079
result:
ok 1 number(s): "96547079"
Test #15:
score: 0
Accepted
time: 14ms
memory: 12096kb
input:
11
output:
296100513
result:
ok 1 number(s): "296100513"
Test #16:
score: 0
Accepted
time: 15ms
memory: 11848kb
input:
12
output:
672446962
result:
ok 1 number(s): "672446962"
Test #17:
score: 0
Accepted
time: 14ms
memory: 11792kb
input:
13
output:
986909297
result:
ok 1 number(s): "986909297"
Test #18:
score: 0
Accepted
time: 14ms
memory: 11784kb
input:
14
output:
306542229
result:
ok 1 number(s): "306542229"
Test #19:
score: 0
Accepted
time: 14ms
memory: 11796kb
input:
15
output:
8548107
result:
ok 1 number(s): "8548107"
Test #20:
score: 0
Accepted
time: 11ms
memory: 11796kb
input:
16
output:
773960239
result:
ok 1 number(s): "773960239"
Test #21:
score: 0
Accepted
time: 15ms
memory: 11804kb
input:
17
output:
611627547
result:
ok 1 number(s): "611627547"
Test #22:
score: 0
Accepted
time: 13ms
memory: 11852kb
input:
18
output:
91793980
result:
ok 1 number(s): "91793980"
Test #23:
score: 0
Accepted
time: 7ms
memory: 11860kb
input:
19
output:
689202618
result:
ok 1 number(s): "689202618"
Test #24:
score: 0
Accepted
time: 11ms
memory: 11860kb
input:
20
output:
605957782
result:
ok 1 number(s): "605957782"
Test #25:
score: 0
Accepted
time: 141ms
memory: 14816kb
input:
10000
output:
713782215
result:
ok 1 number(s): "713782215"
Test #26:
score: 0
Accepted
time: 304ms
memory: 17592kb
input:
20000
output:
337916836
result:
ok 1 number(s): "337916836"
Test #27:
score: 0
Accepted
time: 300ms
memory: 17484kb
input:
30000
output:
580803285
result:
ok 1 number(s): "580803285"
Test #28:
score: 0
Accepted
time: 636ms
memory: 24396kb
input:
40000
output:
732660392
result:
ok 1 number(s): "732660392"
Test #29:
score: 0
Accepted
time: 636ms
memory: 24420kb
input:
50000
output:
660835595
result:
ok 1 number(s): "660835595"
Test #30:
score: 0
Accepted
time: 640ms
memory: 24468kb
input:
60000
output:
323452070
result:
ok 1 number(s): "323452070"
Test #31:
score: 0
Accepted
time: 1327ms
memory: 38044kb
input:
70000
output:
307315915
result:
ok 1 number(s): "307315915"
Test #32:
score: 0
Accepted
time: 1334ms
memory: 38124kb
input:
80000
output:
951757567
result:
ok 1 number(s): "951757567"
Test #33:
score: 0
Accepted
time: 1337ms
memory: 38044kb
input:
90000
output:
426123208
result:
ok 1 number(s): "426123208"
Test #34:
score: 0
Accepted
time: 1329ms
memory: 37960kb
input:
100000
output:
827418228
result:
ok 1 number(s): "827418228"
Test #35:
score: 0
Accepted
time: 1332ms
memory: 38056kb
input:
110000
output:
541614559
result:
ok 1 number(s): "541614559"
Test #36:
score: 0
Accepted
time: 1357ms
memory: 38128kb
input:
120000
output:
184688986
result:
ok 1 number(s): "184688986"
Test #37:
score: 0
Accepted
time: 1339ms
memory: 38020kb
input:
130000
output:
898089371
result:
ok 1 number(s): "898089371"
Test #38:
score: 0
Accepted
time: 2870ms
memory: 61740kb
input:
140000
output:
949540221
result:
ok 1 number(s): "949540221"
Test #39:
score: 0
Accepted
time: 2833ms
memory: 61668kb
input:
150000
output:
767689851
result:
ok 1 number(s): "767689851"
Test #40:
score: 0
Accepted
time: 2830ms
memory: 61588kb
input:
160000
output:
553494563
result:
ok 1 number(s): "553494563"
Test #41:
score: 0
Accepted
time: 2808ms
memory: 61692kb
input:
170000
output:
270711750
result:
ok 1 number(s): "270711750"
Test #42:
score: 0
Accepted
time: 2837ms
memory: 61588kb
input:
180000
output:
108155689
result:
ok 1 number(s): "108155689"
Test #43:
score: 0
Accepted
time: 2860ms
memory: 61576kb
input:
190000
output:
327542856
result:
ok 1 number(s): "327542856"
Test #44:
score: 0
Accepted
time: 2892ms
memory: 61592kb
input:
200000
output:
236144151
result:
ok 1 number(s): "236144151"
Test #45:
score: 0
Accepted
time: 2851ms
memory: 61764kb
input:
198798
output:
16935264
result:
ok 1 number(s): "16935264"
Extra Test:
score: 0
Extra Test Passed