QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#255617#7746. Go go Baron Bunny!ucup-team1198#AC ✓76ms139736kbC++207.7kb2023-11-18 16:30:012023-11-18 16:30:01

Judging History

This is the latest submission verdict.

  • [2023-11-18 16:30:01]
  • Judged
  • Verdict: AC
  • Time: 76ms
  • Memory: 139736kb
  • [2023-11-18 16:30:01]
  • Submitted

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,我给组数据试试?

詳細信息

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