QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#255617 | #7746. Go go Baron Bunny! | ucup-team1198# | AC ✓ | 76ms | 139736kb | C++20 | 7.7kb | 2023-11-18 16:30:01 | 2023-11-18 16:30:01 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
#define ld long double
#define all(a) (a).begin(), (a).end()
const int MOD = 998244353;
int add(int a, int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int sub(int a, int b) {
return a >= b ? a - b : a + MOD - b;
}
int mul(int a, int b) {
return (1ll * a * b) % MOD;
}
int pw(int x, int n) {
int res = 1;
while (n) {
if (n % 2 == 0) {
x = mul(x, x);
n /= 2;
} else {
res = mul(res, x);
--n;
}
}
return res;
}
const int MAXF = 2e6;
int fact[MAXF], invf[MAXF];
int C(int n, int k) {
return mul(fact[n], mul(invf[k], invf[n - k]));
}
int get(int a, int b, int c) {
return mul(C(b - 1, c - 1), C(a, c));
}
int mu[MAXF], mn[MAXF];
vector<int> divis[MAXF];
vector<int> ans[MAXF];
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
fact[0] = 1;
for (int i = 1; i < MAXF; ++i) {
fact[i] = mul(fact[i - 1], i);
}
invf[MAXF - 1] = pw(fact[MAXF - 1], MOD - 2);
for (int i = MAXF - 1; i > 0; --i) {
invf[i - 1] = mul(invf[i], i);
}
/**int mx = 0;
for (int x = 1; x <= 2'000'000; ++x) {
int sum = 0;
for (int t = 1; t * t <= x; ++t) {
if (x % t == 0) {
sum += x;
if (t * t != x) {
sum += t / x;
}
}
}
if (sum > mx) {
mx = sum;
cout << x << " " << sum << endl;
}
}*/
vector<int> prm;
mu[1] = 1;
for (int i = 2; i < MAXF; ++i) {
if (mn[i] == 0) {
mn[i] = i;
mu[i] = MOD - 1;
prm.push_back(i);
}
for (int p : prm) {
if (p > mn[i] || p * i >= MAXF) break;
mn[p * i] = p;
if (p == mn[i]) {
mu[p * i] = 0;
} else {
mu[p * i] = mul(mu[p], mu[i]);
}
}
}
int64_t n, k, t;
cin >> n >> k >> t;
int x = 0;
while (1ll * x * (x + 1) / 2 < n) ++x;
if (k != x && k != x - 1) {
cout << "0\n";
return 0;
}
int cnt1 = 1ll * x * (x + 1) / 2 - n;
/**int check = 0;
for (int mask = 0; mask < (1 << x); ++mask) {
int sum = 0;
vector<int> arr(x);
for (int i = 0; i < x; ++i) {
if (mask & (1 << i)) {
arr[i] = 1;
++sum;
}
}
if (sum != cnt1) continue;
if (k == x - 1 && arr[0] == 0) continue;
if (k == x && arr[0] == 1) continue;
bool f = true;
for (int i = 0; i < x; ++i) {
if (arr[(i + t) % x] != arr[i]) {
f = false;
}
}
if (!f) continue;
int cnt01 = 0;
for (int i = 1; i < x; ++i) {
if (arr[i - 1] == 0 && arr[i] == 1) ++cnt01;
}
int cur = fact[k];
for (int i = 0; i < cnt01; ++i) {
cur = mul(cur, (MOD + 1) / 2);
}
check = add(check, cur);
}
cerr << check << endl;*/
bool adeq = true;
if (k == x - 1) {
adeq = false;
if (n == 1ll * x * (x + 1) / 2) {
cout << "0\n";
return 0;
}
cnt1 = x - cnt1;
}
if (n == 1ll * x * (x + 1) / 2) {
cout << fact[x] << "\n";
return 0;
}
t = __gcd(t, (int64_t)x);
/**for (int i = 1; i <= t; ++i) {
if (t % i != 0) continue;
for (int j = 2 * i; j <= t; j += i) {
divis[j].push_back(i);
}
}*/
vector<int> pw2(x + 1);
pw2[0] = 1;
for (int i = 1; i <= x; ++i) {
pw2[i] = mul(pw2[i - 1], (MOD + 1) / 2);
}
int total = 0;
if (adeq) {
/// int64_t sum = 0;
for (int d = 1; d <= t; ++d) {
if (t % d != 0) continue;
if (cnt1 % (x / d) != 0) continue;
/// sum += d;
/// /// cerr << "d: " << d << endl;
vector<int> ans(d + 1);
int c1 = cnt1 / (x / d);
int c0 = d - c1;
for (int i = 1; i <= d; ++i) {
if (i <= c0 && i <= c1) {
ans[i] = get(c0, c1, i);
}
}
/// /// /// cerr << ans[d][0] << " " << ans[d][1] << " " << ans[d][2] << endl;
/// /// cerr << "init done" << endl;
/**for (int d1 : divis[d]) {
if (cnt1 % (x / d1) != 0) continue;
for (int i = 0; i <= d1; ++i) {
ans[d][i * (d / d1)] = sub(ans[d][i * (d / d1)], ans[d1][i]);
}
}*/
int cnt = 0;
for (int d1 = d; d1 <= t; d1 += d) {
if (t % d1 != 0) continue;
if (cnt1 % (x / d1) != 0) continue;
cnt = add(cnt, mu[d1 / d]);
}
for (int i = 0; i <= d; ++i) {
total = add(total, mul(cnt, mul(ans[i], pw2[i * (x / d)])));
}
/// cerr << "d: " << d << endl;
/// cerr << "total: " << mul(total, fact[x]) << endl;
}
/// cerr << sum << endl;
cout << mul(total, fact[x]) << "\n";
} else {
for (int d = 1; d <= t; ++d) {
if (t % d != 0) continue;
if (cnt1 % (x / d) != 0) continue;
vector<int> ans(d + 1);
int c1 = cnt1 / (x / d);
int c0 = d - c1;
for (int i = 1; i <= d; ++i) {
if (i <= c0 && i <= c1) {
ans[i] = mul(C(c0 - 1, i - 1), C(c1 - 1, i - 1));
}
}
/**for (int d1 : divis[d]) {
if (cnt1 % (x / d1) != 0) continue;
for (int i = 0; i <= d1; ++i) {
ans[d][i * (d / d1)] = sub(ans[d][i * (d / d1)], ans[d1][i]);
}
}*/
int cnt = 0;
for (int d1 = d; d1 <= t; d1 += d) {
if (t % d1 != 0) continue;
if (cnt1 % (x / d1) != 0) continue;
cnt = add(cnt, mu[d1 / d]);
}
for (int i = 1; i <= d; ++i) {
total = add(total, mul(cnt, mul(ans[i], pw2[i * (x / d) - 1])));
}
/// cerr << "d: " << d << endl;
/// cerr << "total: " << mul(total, fact[x]) << endl;
}
for (int d = 1; d <= t; ++d) {
if (t % d != 0) continue;
if (cnt1 % (x / d) != 0) continue;
int c1 = cnt1 / (x / d);
int c0 = d - c1;
vector<int> ans(d + 1);
for (int i = 1; i <= d; ++i) {
if (i < c0 && i <= c1) {
ans[i] = mul(C(c0 - 1, i), C(c1 - 1, i - 1));
}
}
/// /// /// cerr << ans[d][0] << " " << ans[d][1] << " " << ans[d][2] << endl;
/// /// cerr << "init done" << endl;
/**for (int d1 : divis[d]) {
if (cnt1 % (x / d1) != 0) continue;
for (int i = 0; i <= d1; ++i) {
ans[d][i * (d / d1)] = sub(ans[d][i * (d / d1)], ans[d1][i]);
}
}*/
int cnt = 0;
for (int d1 = d; d1 <= t; d1 += d) {
if (t % d1 != 0) continue;
if (cnt1 % (x / d1) != 0) continue;
cnt = add(cnt, mu[d1 / d]);
}
for (int i = 0; i <= d; ++i) {
total = add(total, mul(cnt, mul(ans[i], pw2[i * (x / d)])));
}
/// cerr << "d: " << d << endl;
/// cerr << "total: " << mul(total, fact[x]) << endl;
}
cout << mul(total, fact[k]) << "\n";
}
return 0;
}
这程序好像有点Bug,我给组数据试试?
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 32ms
memory: 129256kb
input:
2 1 2
output:
1
result:
ok 1 number(s): "1"
Test #2:
score: 0
Accepted
time: 48ms
memory: 129144kb
input:
8 4 2
output:
6
result:
ok 1 number(s): "6"
Test #3:
score: 0
Accepted
time: 43ms
memory: 129148kb
input:
29 7 154
output:
0
result:
ok 1 number(s): "0"
Test #4:
score: 0
Accepted
time: 31ms
memory: 129192kb
input:
50 10 10
output:
77225400
result:
ok 1 number(s): "77225400"
Test #5:
score: 0
Accepted
time: 53ms
memory: 129068kb
input:
50 9 10
output:
11362680
result:
ok 1 number(s): "11362680"
Test #6:
score: 0
Accepted
time: 31ms
memory: 129136kb
input:
2 1 1
output:
0
result:
ok 1 number(s): "0"
Test #7:
score: 0
Accepted
time: 38ms
memory: 128996kb
input:
20 6 15
output:
0
result:
ok 1 number(s): "0"
Test #8:
score: 0
Accepted
time: 48ms
memory: 129220kb
input:
31 7 62
output:
0
result:
ok 1 number(s): "0"
Test #9:
score: 0
Accepted
time: 31ms
memory: 129176kb
input:
1 1 1
output:
1
result:
ok 1 number(s): "1"
Test #10:
score: 0
Accepted
time: 40ms
memory: 129012kb
input:
1 1 1000000000000
output:
1
result:
ok 1 number(s): "1"
Test #11:
score: 0
Accepted
time: 48ms
memory: 129160kb
input:
1000000 1414 999999999292
output:
626239238
result:
ok 1 number(s): "626239238"
Test #12:
score: 0
Accepted
time: 36ms
memory: 128992kb
input:
1000000 1413 999999999292
output:
804023673
result:
ok 1 number(s): "804023673"
Test #13:
score: 0
Accepted
time: 32ms
memory: 128976kb
input:
637704 1129 999999999368
output:
376288586
result:
ok 1 number(s): "376288586"
Test #14:
score: 0
Accepted
time: 40ms
memory: 129252kb
input:
777711 1246 999999999893
output:
315967293
result:
ok 1 number(s): "315967293"
Test #15:
score: 0
Accepted
time: 42ms
memory: 129136kb
input:
738077 1215 999999999405
output:
481429116
result:
ok 1 number(s): "481429116"
Test #16:
score: 0
Accepted
time: 41ms
memory: 129252kb
input:
878084 1324 999999999825
output:
85615210
result:
ok 1 number(s): "85615210"
Test #17:
score: 0
Accepted
time: 40ms
memory: 129180kb
input:
879744 1326 999999998712
output:
826681339
result:
ok 1 number(s): "826681339"
Test #18:
score: 0
Accepted
time: 37ms
memory: 129252kb
input:
519750 1019 999999999120
output:
380025867
result:
ok 1 number(s): "380025867"
Test #19:
score: 0
Accepted
time: 38ms
memory: 129140kb
input:
521410 1021 999999999509
output:
43307492
result:
ok 1 number(s): "43307492"
Test #20:
score: 0
Accepted
time: 37ms
memory: 129140kb
input:
578829 1075 999999999204
output:
847975635
result:
ok 1 number(s): "847975635"
Test #21:
score: 0
Accepted
time: 37ms
memory: 129176kb
input:
580490 1077 3
output:
0
result:
ok 1 number(s): "0"
Test #22:
score: 0
Accepted
time: 42ms
memory: 129004kb
input:
720496 1199 240
output:
0
result:
ok 1 number(s): "0"
Test #23:
score: 0
Accepted
time: 32ms
memory: 129204kb
input:
722157 1202 601
output:
952370308
result:
ok 1 number(s): "952370308"
Test #24:
score: 0
Accepted
time: 40ms
memory: 129256kb
input:
862163 1312 1313
output:
626393445
result:
ok 1 number(s): "626393445"
Test #25:
score: 0
Accepted
time: 42ms
memory: 129008kb
input:
822530 1283 1
output:
0
result:
ok 1 number(s): "0"
Test #26:
score: 0
Accepted
time: 34ms
memory: 129160kb
input:
962536 1386 1
output:
0
result:
ok 1 number(s): "0"
Test #27:
score: 0
Accepted
time: 49ms
memory: 128988kb
input:
1000000 1412 999999999292
output:
0
result:
ok 1 number(s): "0"
Test #28:
score: 0
Accepted
time: 44ms
memory: 129160kb
input:
1000000000 44721 999999975339
output:
510734471
result:
ok 1 number(s): "510734471"
Test #29:
score: 0
Accepted
time: 31ms
memory: 129252kb
input:
1000000000 44720 999999975339
output:
848193647
result:
ok 1 number(s): "848193647"
Test #30:
score: 0
Accepted
time: 45ms
memory: 129196kb
input:
842907373 41059 999999992564
output:
372008876
result:
ok 1 number(s): "372008876"
Test #31:
score: 0
Accepted
time: 36ms
memory: 128980kb
input:
509306715 31915 999999995252
output:
449159217
result:
ok 1 number(s): "449159217"
Test #32:
score: 0
Accepted
time: 34ms
memory: 129252kb
input:
724371023 38062 999999995226
output:
184015087
result:
ok 1 number(s): "184015087"
Test #33:
score: 0
Accepted
time: 41ms
memory: 129260kb
input:
890770366 42207 999999997728
output:
181797941
result:
ok 1 number(s): "181797941"
Test #34:
score: 0
Accepted
time: 35ms
memory: 129180kb
input:
900801961 42445 999999997945
output:
723246071
result:
ok 1 number(s): "723246071"
Test #35:
score: 0
Accepted
time: 35ms
memory: 129272kb
input:
567201303 33680 999999971049
output:
976667605
result:
ok 1 number(s): "976667605"
Test #36:
score: 0
Accepted
time: 31ms
memory: 129144kb
input:
782265611 39554 999999995722
output:
382214761
result:
ok 1 number(s): "382214761"
Test #37:
score: 0
Accepted
time: 29ms
memory: 128936kb
input:
743632241 38564 999999975555
output:
622113251
result:
ok 1 number(s): "622113251"
Test #38:
score: 0
Accepted
time: 41ms
memory: 128980kb
input:
753663836 38824 2
output:
0
result:
ok 1 number(s): "0"
Test #39:
score: 0
Accepted
time: 46ms
memory: 129196kb
input:
920063179 42896 181
output:
0
result:
ok 1 number(s): "0"
Test #40:
score: 0
Accepted
time: 48ms
memory: 129004kb
input:
635127486 35641 29
output:
0
result:
ok 1 number(s): "0"
Test #41:
score: 0
Accepted
time: 35ms
memory: 129172kb
input:
801526829 40037 40038
output:
966008245
result:
ok 1 number(s): "966008245"
Test #42:
score: 0
Accepted
time: 34ms
memory: 129208kb
input:
811558424 40288 4
output:
0
result:
ok 1 number(s): "0"
Test #43:
score: 0
Accepted
time: 46ms
memory: 129172kb
input:
977957767 44225 1134
output:
0
result:
ok 1 number(s): "0"
Test #44:
score: 0
Accepted
time: 38ms
memory: 128956kb
input:
1000000000 44719 999999975339
output:
0
result:
ok 1 number(s): "0"
Test #45:
score: 0
Accepted
time: 55ms
memory: 139736kb
input:
1000000000000 1414214 999999204684
output:
486279705
result:
ok 1 number(s): "486279705"
Test #46:
score: 0
Accepted
time: 62ms
memory: 139700kb
input:
1000000000000 1414213 999999204684
output:
480189439
result:
ok 1 number(s): "480189439"
Test #47:
score: 0
Accepted
time: 44ms
memory: 129172kb
input:
815496560693 811750096047 999999745266
output:
0
result:
ok 1 number(s): "0"
Test #48:
score: 0
Accepted
time: 49ms
memory: 129012kb
input:
582297122576 579821664123 999999766452
output:
0
result:
ok 1 number(s): "0"
Test #49:
score: 0
Accepted
time: 63ms
memory: 137304kb
input:
554379675168 1052976 999999724464
output:
850999094
result:
ok 1 number(s): "850999094"
Test #50:
score: 0
Accepted
time: 75ms
memory: 138904kb
input:
825475204348 1284892 999998814682
output:
718965161
result:
ok 1 number(s): "718965161"
Test #51:
score: 0
Accepted
time: 53ms
memory: 138808kb
input:
801852724236 1266375 999999350625
output:
266617066
result:
ok 1 number(s): "266617066"
Test #52:
score: 0
Accepted
time: 76ms
memory: 137264kb
input:
568653286119 1066445 999998949078
output:
268095321
result:
ok 1 number(s): "268095321"
Test #53:
score: 0
Accepted
time: 42ms
memory: 136956kb
input:
540735838711 1039938 999999181110
output:
955131707
result:
ok 1 number(s): "955131707"
Test #54:
score: 0
Accepted
time: 64ms
memory: 138848kb
input:
807536400595 1270854 999998944705
output:
83358005
result:
ok 1 number(s): "83358005"
Test #55:
score: 0
Accepted
time: 41ms
memory: 136176kb
input:
779618953187 1248694 624347
output:
695027909
result:
ok 1 number(s): "695027909"
Test #56:
score: 0
Accepted
time: 52ms
memory: 133076kb
input:
546419515070 1045388 1
output:
0
result:
ok 1 number(s): "0"
Test #57:
score: 0
Accepted
time: 50ms
memory: 134328kb
input:
527092002255 1026735 342245
output:
168868859
result:
ok 1 number(s): "168868859"
Test #58:
score: 0
Accepted
time: 47ms
memory: 133764kb
input:
793892564138 1260072 1
output:
0
result:
ok 1 number(s): "0"
Test #59:
score: 0
Accepted
time: 48ms
memory: 133516kb
input:
765975116731 1237720 44
output:
0
result:
ok 1 number(s): "0"
Test #60:
score: 0
Accepted
time: 35ms
memory: 132824kb
input:
532775678613 1032254 11865
output:
0
result:
ok 1 number(s): "0"
Test #61:
score: 0
Accepted
time: 37ms
memory: 129212kb
input:
1000000000000 1414212 999999204684
output:
0
result:
ok 1 number(s): "0"
Extra Test:
score: 0
Extra Test Passed