QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#4522#426. 传统艺能Qingyu✨100 ✓211ms16620kbC++113.9kb2020-06-27 17:33:002021-12-19 05:21:53

Judging History

This is the latest submission verdict.

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2021-12-19 05:21:53]
  • Judged
  • Verdict: 100
  • Time: 211ms
  • Memory: 16620kb
  • [2020-06-27 17:33:00]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5, mo = 998244353;
inline void add(int& a, const int& b) {
    a += b - mo;
    a += a >> 31 & mo;
}
inline int poww(int x, int y) {
    int ans = 1;
    for (; y; y >>= 1, x = 1ll * x * x % mo)
        if (y & 1)
            ans = 1ll * ans * x % mo;
    return ans;
}
struct mat {
    int a[3][3];
};
mat I;
inline mat operator*(const mat& a, const mat& b) {
    static mat d;
    static long long c[3][3];
    memset(c, 0, sizeof c);
    c[0][0] += 1ll * a.a[0][0] * b.a[0][0];
    c[0][1] += 1ll * a.a[0][0] * b.a[0][1];
    c[0][2] += 1ll * a.a[0][0] * b.a[0][2];
    c[0][0] += 1ll * a.a[0][1] * b.a[1][0];
    c[0][1] += 1ll * a.a[0][1] * b.a[1][1];
    c[0][2] += 1ll * a.a[0][1] * b.a[1][2];
    c[0][0] += 1ll * a.a[0][2] * b.a[2][0];
    c[0][1] += 1ll * a.a[0][2] * b.a[2][1];
    c[0][2] += 1ll * a.a[0][2] * b.a[2][2];
    c[1][0] += 1ll * a.a[1][0] * b.a[0][0];
    c[1][1] += 1ll * a.a[1][0] * b.a[0][1];
    c[1][2] += 1ll * a.a[1][0] * b.a[0][2];
    c[1][0] += 1ll * a.a[1][1] * b.a[1][0];
    c[1][1] += 1ll * a.a[1][1] * b.a[1][1];
    c[1][2] += 1ll * a.a[1][1] * b.a[1][2];
    c[1][0] += 1ll * a.a[1][2] * b.a[2][0];
    c[1][1] += 1ll * a.a[1][2] * b.a[2][1];
    c[1][2] += 1ll * a.a[1][2] * b.a[2][2];
    c[2][0] += 1ll * a.a[2][0] * b.a[0][0];
    c[2][1] += 1ll * a.a[2][0] * b.a[0][1];
    c[2][2] += 1ll * a.a[2][0] * b.a[0][2];
    c[2][0] += 1ll * a.a[2][1] * b.a[1][0];
    c[2][1] += 1ll * a.a[2][1] * b.a[1][1];
    c[2][2] += 1ll * a.a[2][1] * b.a[1][2];
    c[2][0] += 1ll * a.a[2][2] * b.a[2][0];
    c[2][1] += 1ll * a.a[2][2] * b.a[2][1];
    c[2][2] += 1ll * a.a[2][2] * b.a[2][2];
    d.a[0][0] = c[0][0] % mo;
    d.a[0][1] = c[0][1] % mo;
    d.a[0][2] = c[0][2] % mo;
    d.a[1][0] = c[1][0] % mo;
    d.a[1][1] = c[1][1] % mo;
    d.a[1][2] = c[1][2] % mo;
    d.a[2][0] = c[2][0] % mo;
    d.a[2][1] = c[2][1] % mo;
    d.a[2][2] = c[2][2] % mo;
    return d;
}
inline mat poww(mat a, int k) {
    mat ans = I;
    for (; k; k >>= 1, a = a * a)
        if (k & 1)
            ans = ans * a;
    return ans;
}
int n, K, ans, tcnt = 1;
struct node {
    int l, r, m, fa, o;
} t[N];
void build(int i) {
    static int l, r, fa, o;
    l = t[i].l;
    r = t[i].r;
    fa = t[i].fa;
    o = t[i].o;
    mat A;
    memset(A.a, 0, sizeof A.a);
    int v1, v2, v3, v4, v5;
    v1 = 1ll * l * (n - r + 1) % mo;
    v5 = i > 1 ? 1ll * t[fa].l * (n - t[fa].r + 1) % mo : 0;
    v3 = (1ll * n * (n + 1) / 2 - 1ll * l * (l - 1) / 2 - 1ll * (n - r) * (n - r + 1) / 2) % mo;
    v3 = (v3 + mo - v1) % mo;
    v1 = (v1 + mo - v5) % mo;
    int z = fa ? (t[fa].r - t[fa].l + 1) - (t[i].r - t[i].l + 1) : 0;
    v2 = 1ll * (z + 1) * z / 2 % mo;
    if (o && fa) {
        v2 = (v2 + 1ll * (t[fa].l - 1) * z) % mo;
    } else {
        v2 = (v2 + 1ll * (n - t[fa].r) * z) % mo;
    }
    v4 = (4ll * mo + 1ll * n * (n + 1) / 2 - v1 - v2 - v3 - v5) % mo;
    add(A.a[0][2], v1);
    add(A.a[1][2], v1);
    add(A.a[2][2], v1);
    add(A.a[0][0], v2);
    add(A.a[1][2], v2);
    add(A.a[2][2], v2);
    add(A.a[0][0], v3);
    add(A.a[1][0], v3);
    add(A.a[2][0], v3);
    add(A.a[0][0], v4);
    add(A.a[1][1], v4);
    add(A.a[2][2], v4);
    add(A.a[0][1], v5);
    add(A.a[1][1], v5);
    add(A.a[2][2], v5);
    ans = (ans + poww(A, K).a[0][2]) % mo;
    if (l == r)
        return;
    cin >> t[i].m;
    t[++tcnt] = (node){ t[i].l, t[i].m, 0, i, 0 };
    build(tcnt);
    t[++tcnt] = (node){ t[i].m + 1, t[i].r, 0, i, 1 };
    build(tcnt);
}
int main() {
    for (int i = 0; i < 3; ++i) I.a[i][i] = 1;
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> K;
    t[1].l = 1;
    t[1].r = n;
    build(1);
    ans = 1ll * ans * poww(poww(1ll * n * (n + 1) / 2 % mo, K), mo - 2) % mo;
    cout << ans << endl;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 10
Accepted
time: 2ms
memory: 3524kb

input:

10 4
3 2 1 8 6 5 4 7 9

output:

181617343

result:

ok 1 number(s): "181617343"

Test #2:

score: 10
Accepted
time: 2ms
memory: 3528kb

input:

10 91
9 8 5 3 1 2 4 6 7

output:

979294405

result:

ok 1 number(s): "979294405"

Test #3:

score: 10
Accepted
time: 0ms
memory: 3404kb

input:

5 985433385
4 1 3 2

output:

581616517

result:

ok 1 number(s): "581616517"

Test #4:

score: 10
Accepted
time: 34ms
memory: 16552kb

input:

194809 1
194807 3 2 1 12 9 8 4 5 7 6 10 11 14 13 22 21 19 16 15 18 17 20 194798 24 23 194795 194790 194785 27 26 25 31 28 29 30 40 34 33 32 39 38 36 35 37 48 46 45 44 43 41 42 47 194782 50 49 194778 194770 56 55 54 51 52 53 194764 194762 194753 194747 60 57 58 59 67 63 61 62 64 66 65 74 68 69 73 72 70 71 76 75 81 78 77 80 79 86 85 84 82 83 89 87 88 194741 95 90 91 94 93 92 97 96 104 100 98 99 101 102 103 108 107 106 105 194738 110 109 113 112 111 117 116 115 114 120 119 118 194729 130 125 121 12...

output:

67027862

result:

ok 1 number(s): "67027862"

Test #5:

score: 10
Accepted
time: 2ms
memory: 3396kb

input:

32 946189239
16 8 4 2 1 3 6 5 7 12 10 9 11 14 13 15 24 20 18 17 19 22 21 23 28 26 25 27 30 29 31

output:

602568459

result:

ok 1 number(s): "602568459"

Test #6:

score: 10
Accepted
time: 2ms
memory: 3464kb

input:

64 927627601
32 16 8 4 2 1 3 6 5 7 12 10 9 11 14 13 15 24 20 18 17 19 22 21 23 28 26 25 27 30 29 31 48 40 36 34 33 35 38 37 39 44 42 41 43 46 45 47 56 52 50 49 51 54 53 55 60 58 57 59 62 61 63

output:

289230741

result:

ok 1 number(s): "289230741"

Test #7:

score: 10
Accepted
time: 7ms
memory: 3596kb

input:

4096 915714134
2048 1024 512 256 128 64 32 16 8 4 2 1 3 6 5 7 12 10 9 11 14 13 15 24 20 18 17 19 22 21 23 28 26 25 27 30 29 31 48 40 36 34 33 35 38 37 39 44 42 41 43 46 45 47 56 52 50 49 51 54 53 55 60 58 57 59 62 61 63 96 80 72 68 66 65 67 70 69 71 76 74 73 75 78 77 79 88 84 82 81 83 86 85 87 92 90 89 91 94 93 95 112 104 100 98 97 99 102 101 103 108 106 105 107 110 109 111 120 116 114 113 115 118 117 119 124 122 121 123 126 125 127 192 160 144 136 132 130 129 131 134 133 135 140 138 137 139 142...

output:

246047302

result:

ok 1 number(s): "246047302"

Test #8:

score: 10
Accepted
time: 3ms
memory: 3776kb

input:

4634 906063294
2144 1427 815 694 205 105 55 10 5 1 3 2 4 6 7 8 9 43 41 24 18 16 12 11 13 15 14 17 23 19 21 20 22 34 32 31 29 25 26 27 28 30 33 37 36 35 38 40 39 42 46 45 44 52 47 49 48 50 51 53 54 100 77 72 57 56 64 60 58 59 61 62 63 70 69 65 67 66 68 71 75 74 73 76 85 82 80 78 79 81 84 83 87 86 90 89 88 97 94 91 93 92 96 95 98 99 104 101 103 102 193 191 179 160 154 134 106 127 111 107 108 109 110 115 114 113 112 120 119 116 117 118 121 122 126 123 125 124 129 128 130 132 131 133 145 138 136 135...

output:

416904570

result:

ok 1 number(s): "416904570"

Test #9:

score: 10
Accepted
time: 107ms
memory: 10916kb

input:

95552 924470405
7 3 1 2 4 6 5 10 8 9 95547 16 11 15 14 12 13 95543 95533 25 24 23 19 17 18 22 21 20 27 26 95528 34 29 28 33 30 32 31 40 35 39 36 38 37 95519 47 44 41 43 42 45 46 95517 95514 56 49 48 55 54 53 52 50 51 59 57 58 64 60 62 61 63 95509 66 65 69 68 67 71 70 78 77 72 75 73 74 76 95504 82 81 79 80 86 83 84 85 95502 93 87 92 91 90 89 88 99 95 94 97 96 98 95493 95486 101 100 95482 104 102 103 108 107 105 106 95477 118 113 109 110 111 112 114 117 116 115 95474 121 119 120 125 122 123 124 13...

output:

778611049

result:

ok 1 number(s): "778611049"

Test #10:

score: 10
Accepted
time: 211ms
memory: 16620kb

input:

194473 918039998
194469 5 1 2 3 4 10 6 7 9 8 194466 19 12 11 17 13 16 15 14 18 194462 194457 194450 194445 194437 194428 194422 194420 194415 194413 194407 194405 194402 194400 23 21 20 22 194396 194393 194389 194382 31 24 30 29 28 27 26 25 194375 34 32 33 39 36 35 38 37 42 40 41 194372 45 43 44 194370 194363 194358 52 50 49 48 47 46 51 194355 194351 194349 194346 55 54 53 194339 58 56 57 194333 194324 194319 194313 67 61 59 60 62 66 63 65 64 77 74 71 70 68 69 72 73 75 76 82 78 79 81 80 86 83 84...

output:

128548459

result:

ok 1 number(s): "128548459"