QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#707582#9526. Subsequence Countingucup-team173AC ✓1601ms152460kbC++205.9kb2024-11-03 16:38:332024-11-03 16:38:38

Judging History

你现在查看的是最新测评结果

  • [2024-11-03 16:38:38]
  • 评测
  • 测评结果:AC
  • 用时:1601ms
  • 内存:152460kb
  • [2024-11-03 16:38:33]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
constexpr int P = 998244353;

struct Matrix {
	int x, y;
    vector<vector<int>> a;
	Matrix(int _x = 0, int _y = 0) : x(_x), y(_y) {
		a.resize(x, vector<int>(y, 0));
	}
	vector<int>& operator[](int p) { return a[p]; }
	void I() {
		for(int i = 0; i < x; i++)
			a[i][i] = 1;
	}
	friend Matrix operator+(Matrix a, Matrix b) {
		assert(a.x == b.x && a.y == b.y);
		Matrix c(a.x, a.y);
		for(int i = 0; i < a.x; i++)
			for(int j = 0; j < a.y; j++)
				c[i][j] = (a[i][j] + b[i][j]) % P;
		return c;
	}
	friend Matrix operator*(Matrix a, Matrix b) {
		assert(a.y == b.x);
		Matrix c(a.x, b.y);
        for(int k = 0; k < a.y; k++)
            for(int i = 0; i < a.x; i++)
                for(int j = 0; j < b.y; j++)
					c[i][j] = (c[i][j] + 1ll * a[i][k] * b[k][j]) % P;
		return c;
	}
} I;
Matrix qpow(Matrix a, long long b) {
	assert(a.x == a.y);
	Matrix ret(a.x, a.y); ret.I();
	while(b) {
		if(b & 1) ret = ret * a;
		a = a * a; b >>= 1;
	}
	return ret;
}
ostream& operator<<(ostream& os, Matrix a) {
    for(int i = 0; i < a.x; i++)
        for(int j = 0; j < a.y; j++)
            os << a[i][j] << " \n" [j == a.y - 1];
    return os;
}

ll exgcd(ll a, ll b, ll &x, ll &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    ll g = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return g;
}
ll inv(ll a, ll P) {
    ll x, y;
    exgcd(a, P, x, y);
    return (x % P + P) % P;
}

const int N = 500100;
Matrix a[N], tag[N];
int ls[N], rs[N], pd[N], tot;
int newnode() {
    tot++;
    a[tot] = I;
    ls[tot] = rs[tot] = pd[tot] = 0;
    return tot;
}
void init() {
    tot = -1;
    newnode(), newnode();
}
void pushdown(int k, int l, int mid, int r) {
    if(!ls[k]) ls[k] = newnode();
    if(!rs[k]) rs[k] = newnode();
    if(pd[k]) {
        a[ls[k]] = qpow(tag[k], mid - l + 1);
        a[rs[k]] = qpow(tag[k], r - mid);
        tag[ls[k]] = tag[rs[k]] = tag[k];
        pd[k] = 0, pd[ls[k]] = pd[rs[k]] = 1;
    }
}
void modify(int k, int l, int r, int L, int R, Matrix x) {
    if (L <= l && r <= R) {
        a[k] = qpow(x, r - l + 1);
        tag[k] = x, pd[k] = 1;
        return;
    }
    int mid = (l + r) >> 1;
    pushdown(k, l, mid, r);
    if(L <= mid) modify(ls[k], l, mid, L, R, x);
    if(R > mid) modify(rs[k], mid + 1, r, L, R, x);
    assert(a[rs[k]].y == a[ls[k]].x);
    a[k] = a[rs[k]] * a[ls[k]];
}

void solve() {
    int n, m, k, L;
    cin >> n >> m >> k >> L;
    I = Matrix(m + 1, m + 1), I.I();
    k = inv(k, L);
    vector<Matrix> initM(1001, I);
    vector<int> t(m + 1);
    for(int i = 1; i <= m; i++) {
        cin >> t[i];
        initM[t[i]][i][i - 1] = 1;
    }
    vector<int> l, r;
    vector<Matrix> M;
    for(int i = 1, s = 0; i <= n; i++) {
        int len, v;
        cin >> len >> v;
        l.push_back(s);
        r.push_back(s + len - 1);
        M.push_back(initM[v]);
        s += len;
    }
    auto slv = [&](auto self, int L, int k, vector<int> l, vector<int> r, vector<Matrix> M) {
        // cerr << "------------------- " << L << ' ' << k << ' ' << l.size() << '\n';
        // for(int i : l) cerr << i << ' '; cerr << '\n';
        // for(int i : r) cerr << i << ' '; cerr << '\n';
        // cerr << '\n';
        // for(Matrix i : M) cerr << i << "\n\n";
        if(L == 1) return M[0];
        if(2 * k > L) {
            vector<int> nl, nr;
            vector<Matrix> nM;
            nl.push_back(0), nr.push_back(0);
            nM.push_back(M[0]);
            l[0] = 1;
            for(int i = l.size() - 1; i >= 0; i--) {
                if(r[i] < l[i]) continue;
                nl.push_back(L - r[i]);
                nr.push_back(L - l[i]);
                nM.push_back(M[i]);
            }
            return self(self, L, L - k, nl, nr, nM);
        }
        init();
        int n = l.size(), cnt = (L + k - 1) / k;
        using T = pair<int, pair<int, Matrix>>;
        vector<T> ve; // <ti, pos, M>
        for(int i = 0; i < n; i++) {
            if((l[i] + k - 1) / k <= r[i] / k) {
                modify(1, 0, cnt - 1, (l[i] + k - 1) / k, r[i] / k, M[i]);
            }
            if(l[i] % k != 0) {
                ve.push_back({l[i] % k, {l[i] / k, M[i]}});
            }
        }
        // cerr << "---\n";
        // for(int i = 0; i < k; i++) {
        //     Matrix c = I;
        //     for(int j = i; j < L; j += k) {
        //         int id = lower_bound(r.begin(), r.end(), j) - r.begin();
        //         c = M[id] * c;
        //     }
        //     cerr << c << '\n';
        // }
        // cerr << "---\n";
        if(L % k != 0) {
            ve.push_back({L % k, {cnt - 1, I}});
        }
        sort(ve.begin(), ve.end(), [&](T a, T b) {
            return a.first < b.first;
        });
        ve.push_back({k, {0, I}});
        vector<int> nl, nr;
        vector<Matrix> nM;
        for(int i = 0, lst = 0; i < ve.size(); i++) {
            auto [ti, _] = ve[i];
            auto [pos, tM] = _;
            if(i == 0 || ti != ve[i - 1].first) {
                nl.push_back(lst);
                nr.push_back(ti - 1);
                nM.push_back(a[1]);
                lst = ti;
            }
            if(i + 1 < ve.size()) {
                modify(1, 0, cnt - 1, pos, pos, tM);
            }
        }
        return self(self, k, k - L % k, nl, nr, nM);
    };
    auto res = slv(slv, L, k, l, r, M);
    cout << res[m][0] << '\n';
    // Matrix c = I;
    // for(int i = 0, j = 0; i < L; i++, j = (j + k) % L) {
    //     int id = lower_bound(r.begin(), r.end(), j) - r.begin();
    //     c = M[id] * c;
    // }
    // cerr << c << '\n';
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int t = 1;
    // cin >> t;
    while(t--) solve();
    return 0;
}

这程序好像有点Bug,我给组数据试试?

詳細信息

Test #1:

score: 100
Accepted
time: 3ms
memory: 40504kb

input:

4 2 17 27
3 1
10 3
6 1
10 3
1 1

output:

76

result:

ok single line: '76'

Test #2:

score: 0
Accepted
time: 4ms
memory: 39152kb

input:

5 3 1789 15150
555 718 726
72 555
1029 718
5807 726
1002 718
7240 555

output:

390415327

result:

ok single line: '390415327'

Test #3:

score: 0
Accepted
time: 0ms
memory: 38988kb

input:

1 1 1 1000000000
1000
1000000000 1000

output:

1755647

result:

ok single line: '1755647'

Test #4:

score: 0
Accepted
time: 1601ms
memory: 152460kb

input:

1999 10 999999999 1000000000
944 901 986 915 979 988 947 999 969 946
198832 985
235662 982
367137 938
219700 949
166086 906
488084 905
891250 984
243743 971
253382 987
181971 935
2382 948
462701 981
4681 925
113363 916
119397 921
337742 982
427128 921
285959 986
197975 978
140753 907
167150 974
4576...

output:

211590728

result:

ok single line: '211590728'

Test #5:

score: 0
Accepted
time: 302ms
memory: 98456kb

input:

2000 10 207560381 499173270
382 246 825 688 810 66 333 717 903 444
242322 825
303194 246
266460 66
133293 444
499376 688
175256 333
260041 717
202138 444
84931 688
353443 825
137750 382
333307 66
450617 810
27484 246
349436 717
45179 444
146073 810
107846 717
416816 246
255378 825
433826 688
273215 ...

output:

686508296

result:

ok single line: '686508296'

Test #6:

score: 0
Accepted
time: 311ms
memory: 99332kb

input:

2000 10 261469558 497769147
990 38 906 66 751 758 913 137 187 724
253600 187
50741 758
58978 724
358384 751
258090 137
423638 990
121415 137
162742 758
93886 724
279287 913
392322 38
495784 758
195957 906
47122 913
87008 751
17599 66
22711 38
58373 724
116467 990
495160 724
471978 758
24585 724
3064...

output:

989869378

result:

ok single line: '989869378'

Test #7:

score: 0
Accepted
time: 362ms
memory: 120084kb

input:

2000 10 321529781 512205698
105 216 706 872 564 639 983 85 153 396
319747 706
46163 639
134011 983
293977 153
176149 983
214154 216
45308 706
270691 396
491463 216
207041 639
118670 983
207549 639
430999 706
294263 872
137031 983
270440 85
480934 153
56566 85
462772 872
53771 639
455400 105
496369 8...

output:

43580469

result:

ok single line: '43580469'

Test #8:

score: 0
Accepted
time: 368ms
memory: 111856kb

input:

2000 10 445061541 492744658
724 778 518 949 399 846 571 290 26 719
95511 399
430323 571
269833 399
378561 778
247054 719
449770 571
452091 719
31296 724
107940 26
330171 724
459597 719
454361 949
71045 724
332444 290
165408 518
123580 719
352964 518
187501 571
206988 778
95308 26
351267 846
22564 77...

output:

616245282

result:

ok single line: '616245282'

Test #9:

score: 0
Accepted
time: 334ms
memory: 111576kb

input:

2000 10 82854895 499384144
533 699 969 632 566 827 967 951 475 208
67174 699
373746 475
43811 827
314087 566
487694 632
150698 475
411781 967
289698 475
202029 967
137762 208
21408 967
185906 632
322311 208
111984 967
219226 533
137525 632
194071 969
415968 951
495074 566
384006 699
75700 533
319248...

output:

325482724

result:

ok single line: '325482724'

Test #10:

score: 0
Accepted
time: 327ms
memory: 115048kb

input:

2000 10 68884267 496908428
911 83 655 38 43 219 401 868 444 362
373884 868
301252 43
71730 83
152590 444
495048 43
220127 868
42667 83
152766 401
295425 911
156010 868
194248 655
258290 362
495166 868
359444 38
228210 83
236963 911
373081 401
219519 38
462869 444
132749 83
126049 362
233585 444
4346...

output:

618545771

result:

ok single line: '618545771'

Test #11:

score: 0
Accepted
time: 324ms
memory: 104216kb

input:

2000 10 296584211 502951247
749 916 549 440 155 770 822 335 591 623
391756 916
403204 335
301242 591
162665 440
377091 623
24972 155
312374 916
171135 623
224221 822
408433 623
157158 822
55740 623
425392 591
37832 916
298703 440
119707 591
101034 749
125274 770
6109 440
78022 916
118181 591
325648 ...

output:

601538508

result:

ok single line: '601538508'

Test #12:

score: 0
Accepted
time: 366ms
memory: 123140kb

input:

2000 10 166200743 502716830
533 628 821 905 330 77 520 46 735 156
96144 46
47146 735
295659 905
171260 156
458468 735
6371 77
76608 330
218288 533
67674 821
140084 520
397185 628
439197 520
466128 77
489650 628
280149 77
235961 821
314891 628
285703 821
456792 533
401436 520
415332 905
335720 735
46...

output:

714220375

result:

ok single line: '714220375'

Test #13:

score: 0
Accepted
time: 338ms
memory: 110056kb

input:

2000 10 494777999 498279924
923 543 789 607 512 597 885 462 759 380
472583 543
70 885
281396 597
31713 885
294039 512
495370 607
338181 380
344775 597
457867 607
362253 543
457963 607
431365 597
489637 923
104753 380
49184 923
452889 543
46665 923
326714 462
332474 923
92685 543
293550 380
223152 51...

output:

867398339

result:

ok single line: '867398339'

Test #14:

score: 0
Accepted
time: 260ms
memory: 84640kb

input:

2000 10 145282979 489563793
128 159 828 90 300 425 977 189 186 533
414271 425
461949 90
173115 300
188953 186
147473 90
361413 300
473121 828
418946 128
449971 828
114925 159
102198 828
420347 300
56815 533
334139 90
384997 977
84207 90
202111 977
318891 90
123614 189
42891 300
48668 128
354240 300
...

output:

642735856

result:

ok single line: '642735856'

Test #15:

score: 0
Accepted
time: 294ms
memory: 89420kb

input:

2000 10 73726788 493104227
599 622 889 670 210 778 374 327 308 768
358274 622
227891 778
375954 768
466366 778
411108 374
347592 599
265078 622
174121 327
355147 374
167867 599
46552 374
10552 778
114210 622
331772 768
302246 599
24244 778
91362 622
130440 889
395599 599
394176 308
81768 374
83741 3...

output:

550082279

result:

ok single line: '550082279'

Test #16:

score: 0
Accepted
time: 424ms
memory: 135836kb

input:

2000 10 152855876 496805251
413 309 740 266 721 715 21 857 206 62
209597 62
330590 857
51271 413
168907 721
473281 21
413081 266
196578 721
219198 21
396781 715
53173 206
200590 266
302416 740
15732 721
414567 740
163152 715
138244 413
158638 62
329207 857
16320 740
246121 21
187905 721
262236 62
90...

output:

937550461

result:

ok single line: '937550461'

Test #17:

score: 0
Accepted
time: 350ms
memory: 108132kb

input:

2000 10 370831065 494204662
382 47 32 870 479 272 956 381 367 794
429604 382
154570 479
61831 382
492147 956
327498 272
427937 381
286339 479
468675 382
197165 479
83760 794
37841 32
283143 870
275120 272
76888 382
438285 381
281443 47
238356 32
353474 794
112098 870
380747 272
161610 479
393113 956...

output:

609619628

result:

ok single line: '609619628'

Test #18:

score: 0
Accepted
time: 285ms
memory: 89868kb

input:

2000 10 200672622 505250813
878 452 69 924 341 370 146 95 189 859
34803 95
36193 859
154299 146
211738 189
69700 859
436922 452
499998 341
338104 69
478735 452
489784 146
180937 189
488456 452
196359 95
126209 924
188052 452
321395 924
189009 859
87452 189
255497 878
43661 341
112027 146
33154 69
44...

output:

56885687

result:

ok single line: '56885687'

Test #19:

score: 0
Accepted
time: 396ms
memory: 122560kb

input:

2000 10 72438867 486841996
394 384 548 742 861 766 155 863 283 525
347582 283
399712 861
451073 394
30203 155
477852 742
146217 861
256320 548
448082 384
104663 155
210939 742
351868 525
253138 548
271447 283
238297 525
464783 394
148139 861
354538 384
260219 155
243223 548
498139 525
291494 863
341...

output:

788937438

result:

ok single line: '788937438'

Test #20:

score: 0
Accepted
time: 369ms
memory: 123204kb

input:

2000 10 12876147 507434473
669 614 751 903 152 518 761 303 63 275
385798 669
260649 275
314982 761
84162 614
324086 669
275099 903
22416 63
216034 669
395106 751
149779 63
474229 303
434728 518
313498 903
9711 152
365631 275
177888 669
496592 152
245728 614
394926 152
10600 63
471425 751
289977 761
...

output:

63922908

result:

ok single line: '63922908'

Test #21:

score: 0
Accepted
time: 415ms
memory: 120812kb

input:

2000 10 240752091 504760936
128 816 447 424 211 177 102 675 680 898
270030 128
30581 177
239215 211
69720 102
285784 447
172262 675
362194 898
308818 177
257890 211
175781 102
352094 816
11391 211
19385 447
375117 177
201000 128
262442 675
237421 102
100994 211
102985 128
85249 177
496945 675
444348...

output:

227952735

result:

ok single line: '227952735'

Test #22:

score: 0
Accepted
time: 409ms
memory: 134680kb

input:

2000 10 237980579 505987937
892 269 84 481 972 522 978 105 450 479
252830 105
189317 450
56029 105
262872 522
279860 978
388378 269
84117 522
131970 105
422569 269
331506 479
96166 450
324575 84
144671 450
140397 978
453063 105
220994 84
150678 450
476768 105
330178 84
296397 105
421757 481
5724 269...

output:

468458072

result:

ok single line: '468458072'

Test #23:

score: 0
Accepted
time: 355ms
memory: 116376kb

input:

2000 10 272341843 508681404
116 160 499 709 151 622 443 51 628 184
41291 628
415609 116
126094 709
36858 116
200281 151
249818 160
126135 622
161783 116
354229 160
378133 709
14269 160
72260 499
217499 628
492068 184
13814 116
206702 499
141318 628
489670 116
347538 184
337073 499
257293 622
234135 ...

output:

5538813

result:

ok single line: '5538813'

Test #24:

score: 0
Accepted
time: 324ms
memory: 102712kb

input:

2000 10 356002797 504473516
719 731 800 845 438 24 89 893 91 616
209787 800
11719 89
184449 438
63108 91
331474 719
368355 438
286223 893
100984 91
308890 719
364976 91
244872 845
303525 731
205243 91
147458 800
216532 89
497673 800
280025 719
456560 91
305453 89
254073 24
48745 893
460814 438
27832...

output:

986718855

result:

ok single line: '986718855'

Test #25:

score: 0
Accepted
time: 361ms
memory: 116968kb

input:

2000 10 127175740 494689853
275 190 710 754 848 8 273 837 501 733
440135 8
333895 501
210229 190
88530 273
316662 190
42142 837
163058 8
155823 275
206862 273
23687 837
217900 733
269239 501
463533 710
489832 501
296607 8
364225 501
361620 190
69562 754
220522 273
8424 754
447614 848
292734 501
3145...

output:

297118416

result:

ok single line: '297118416'

Test #26:

score: 0
Accepted
time: 378ms
memory: 118908kb

input:

2000 10 183513063 506311438
833 936 339 149 842 216 182 627 896 257
275174 216
238462 627
100861 896
135959 182
230471 842
273524 149
403111 936
365497 896
331581 149
154269 257
225488 936
458484 339
13236 627
261000 216
6749 339
46847 833
341899 149
46436 257
462934 339
149769 216
330206 257
133342...

output:

23998350

result:

ok single line: '23998350'

Extra Test:

score: 0
Extra Test Passed