QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#728661#9572. Bingoucup-team5062#AC ✓238ms58328kbC++204.1kb2024-11-09 15:36:562024-11-09 15:36:57

Judging History

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

  • [2024-11-09 15:36:57]
  • 评测
  • 测评结果:AC
  • 用时:238ms
  • 内存:58328kb
  • [2024-11-09 15:36:56]
  • 提交

answer

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

const long long mod = 998244353;
const long long base = 3;
long long Fact[1 << 20];
long long Inv[1 << 20];

long long modpow(long long a, long long b, long long m) {
	long long p = 1, q = a;
	for (int i = 0; i < 30; i++) {
		if ((b >> i) & 1) { p *= q; p %= m; }
		q *= q; q %= m;
	}
	return p;
}

long long Division(long long a, long long b, long long m) {
	return (a * modpow(b, m - 2, m)) % m;
}


// ================================================================================= FFT Library
vector<long long> ntt(vector<long long> vec, int typ) {
	long long root = (typ == 1 ? base : Division(1, base, mod));
	int size_ = vec.size();
	vector<long long> dat(size_, 0);

	// Step A. Reverse Order
	for (int i = 0; i < size_; i++) {
		int r1 = 1, r2 = size_ / 2, cur = 0;
		while (r2 >= 1) {
			if ((i & r1) != 0) { cur += r2; }
			r1 <<= 1;
			r2 >>= 1;
		}
		dat[cur] = vec[i];
	}

	// Step B. Calculation
	for (int b = 2; b <= size_; b *= 2) {
		vector<long long> pows(b, 1);
		pows[1] = modpow(root, (mod - 1) / b, mod);
		for (int i = 2; i < b; i++) pows[i] = (1LL * pows[1] * pows[i - 1]) % mod;

		// Main Part
		for (int stt = 0; stt < size_; stt += b) {
			for (int i = 0; i < b / 2; i++) {
				long long r1 = dat[stt + i] + pows[i + 0 * b / 2] * dat[stt + i + b / 2];
				long long r2 = dat[stt + i] + pows[i + 1 * b / 2] * dat[stt + i + b / 2];
				dat[stt + i + 0 * b / 2] = r1 % mod;
				dat[stt + i + 1 * b / 2] = r2 % mod;
			}
		}
	}

	// Step C. Finalize
	if (typ == 2) {
		long long mult = Division(1, size_, mod);
		for (int i = 0; i < size_; i++) dat[i] = (dat[i] * mult) % mod;
	}
	return dat;
}

vector<long long> convolution(vector<long long> A, vector<long long> B) {
	int size_ = 1;
	while (size_ < A.size() + B.size()) size_ *= 2;
	while (A.size() < size_) A.push_back(0);
	while (B.size() < size_) B.push_back(0);

	// First NTT
	vector<long long> r1 = ntt(A, 1);
	vector<long long> r2 = ntt(B, 1);
	vector<long long> r3(size_, 0);
	for (int i = 0; i < size_; i++) r3[i] = (r1[i] * r2[i]) % mod;

	// Second NTT
	return ntt(r3, 2);
}


// ================================================================================= Solve Function
void Initialize() {
	Fact[0] = 1;
	for (int i = 1; i <= 400000; i++) Fact[i] = (1LL * i * Fact[i - 1]) % mod;
	for (int i = 0; i <= 400000; i++) Inv[i] = Division(1, Fact[i], mod);
}

long long ncr(int n, int r) {
	if (n < r || r < 0) return 0;
	return (Fact[n] * Inv[r] % mod) * Inv[n - r] % mod;
}

long long Solve(int H, int W, vector<int> A) {
	vector<long long> param(H * W + 1, 0);
	sort(A.begin(), A.end());
	if (H == 1 || W == 1) {
		return (1LL * A[0] * Fact[H * W]) % mod;
	}

	// Step 1. Get Paramaters
	for (int i = 1; i <= H; i++) {
		for (int j = 1; j <= W; j++) {
			long long way1 = Fact[i * j];
			long long way2 = ncr(H, i);
			long long way3 = ncr(W, j);
			long long way4 = ((H + W - i - j) % 2 == 0 ? +1 : -1);
			long long c = (((way1 * way2) % mod) * ((way3 * way4) % mod)) % mod;
			c = (c + mod) % mod;
			param[i * j] += c;
			param[i * j] %= mod;
		}
	}

	// Step 2. FFT
	vector<long long> Vec1 = param;
	vector<long long> Vec2(H * W + 1, 0);
	for (int i = 0; i <= H * W; i++) Vec2[i] = Inv[H * W - i];
	vector<long long> Result = convolution(Vec1, Vec2);
	while (Result.size() <= 2 * H * W) Result.push_back(0);
	for (int i = 0; i <= H * W; i++) Result[H * W + i] = (Result[H * W + i] * Fact[H * W - i]) % mod;

	// Step 3. Get Answer
	long long ans = 0;
	for (int i = 1; i < H * W - 1; i++) {
		long long ways = (Result[2 * H * W - i] - Result[2 * H * W - i - 1] + mod) % mod;
		long long incr = A[i];
		ans += ways * incr;
		ans %= mod;
	}
	return ans;
}


// ================================================================================= Main Function
int main() {
	int T; cin >> T; Initialize();
	for (int t = 1; t <= T; t++) {
		int H, W; cin >> H >> W;
		vector<int> A(H * W, 0);
		for (int i = 0; i < H * W; i++) scanf("%d", &A[i]);
		cout << Solve(H, W, A) << endl;
	}
	return 0;
}

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

詳細信息

Test #1:

score: 100
Accepted
time: 43ms
memory: 14896kb

input:

4
2 2
1 3 2 4
3 1
10 10 10
1 3
20 10 30
3 4
1 1 4 5 1 4 1 9 1 9 8 10

output:

56
60
60
855346687

result:

ok 4 number(s): "56 60 60 855346687"

Test #2:

score: 0
Accepted
time: 43ms
memory: 12108kb

input:

1
2 2
0 0 998244352 998244352

output:

998244345

result:

ok 1 number(s): "998244345"

Test #3:

score: 0
Accepted
time: 115ms
memory: 11264kb

input:

900
1 1
810487041
1 2
569006976 247513378
1 3
424212910 256484544 661426830
1 4
701056586 563296095 702740883 723333858
1 5
725786515 738465053 821758167 170452477 34260723
1 6
204184507 619884535 208921865 898995024 768400582 369477346
1 7
225635227 321139203 724076812 439129905 405005469 369864252...

output:

810487041
495026756
540662911
541929691
118309348
270925149
575366228
709974238
761347712
304011276
14811741
366145628
638305530
240546928
484276475
603344008
926633861
161768904
239961447
329781933
315752584
578075668
259941994
600147169
402221164
890998500
154285994
181862417
47930994
273729619
64...

result:

ok 900 numbers

Test #4:

score: 0
Accepted
time: 155ms
memory: 11100kb

input:

400
1 995
548100968 635656907 177366910 971271357 314579375 529572241 948721678 455918644 95745688 164857981 499083775 827896554 496889261 111294651 646048809 758286431 163045934 917399362 189372614 267754648 966443706 921589740 228089960 473153545 482816423 37567957 495730380 864445591 568695110 78...

output:

954668084
677509135
636173666
415373646
477286237
209886549
398423120
24466622
672440292
390142124
498517438
305197486
239833057
500821845
475519894
347179487
974036742
810602822
75196204
48378743
393961176
290898056
957916898
434124418
663457674
225283495
704304053
338701802
670053839
137083082
165...

result:

ok 400 numbers

Test #5:

score: 0
Accepted
time: 205ms
memory: 16108kb

input:

40
92 99
14480275 12892621 932457558 584861415 926346518 101583802 498448003 884757899 463949215 661256632 872663851 651132350 565253214 18404795 810166895 145370572 123351313 298382303 777283720 775900024 613503856 817112784 713304484 541301622 595768594 550989875 960159831 571815058 777864097 3608...

output:

614712898
16225927
313765200
824491114
60971514
769510634
58341639
808667102
527187053
319496150
267177120
409701892
245708713
115397703
928197397
533118123
931076329
448328887
672878477
180728812
385639338
504093069
846218180
981546177
906805965
315620628
863877552
348963788
781585156
982673320
275...

result:

ok 40 numbers

Test #6:

score: 0
Accepted
time: 178ms
memory: 13704kb

input:

40
86 92
479103936 690362573 387313968 428679987 770097821 67859949 744428797 919332570 530162857 389639443 851979342 310332074 863845681 155743453 442066584 996725021 385646576 447381083 64960590 818019444 260564007 16381359 36238584 609449698 12466296 532193395 262308857 279184524 454814687 400578...

output:

147127348
995441625
947321329
200561175
846810174
626764591
235790337
30932003
384829067
254218916
20342301
451884441
634808121
241161955
246093492
515701050
978130791
502129313
3431507
775910032
464454612
153447682
53092548
316439192
101505498
40191013
225025922
133184210
209384134
330521977
360716...

result:

ok 40 numbers

Test #7:

score: 0
Accepted
time: 228ms
memory: 58328kb

input:

2
447 447
790583748 764745604 779691526 67598288 308196334 738524513 685610494 336125979 294155123 651917356 898366384 420012139 529304950 133567869 630219750 62853597 606184670 383809162 43962071 826608376 652871696 860138865 675639996 444122802 823442992 841633845 125418467 211407031 726738308 984...

output:

506347658
891054810

result:

ok 2 number(s): "506347658 891054810"

Test #8:

score: 0
Accepted
time: 235ms
memory: 52992kb

input:

2
100 2000
414412015 610256524 548060717 581032168 761297097 50124687 831351681 906381893 842125801 82512258 734351512 844649420 370666628 791011946 232557748 968208094 238084359 933173727 306257334 509581201 774756848 370039888 322700146 641635730 8423279 909781921 238370638 28574480 725141803 9941...

output:

380238486
147107381

result:

ok 2 number(s): "380238486 147107381"

Test #9:

score: 0
Accepted
time: 238ms
memory: 57188kb

input:

2
2000 100
432504867 225538929 546658423 260257767 682179463 892187612 142884587 872658039 89862243 117086929 104310686 342803717 47992235 148221787 695186286 875318238 264248632 320257869 568552597 54600213 364423602 412159309 666014765 235168890 795627687 977929998 351322809 9778000 723545298 1693...

output:

807761546
460321345

result:

ok 2 number(s): "807761546 460321345"

Test #10:

score: 0
Accepted
time: 226ms
memory: 56688kb

input:

2
10 20000
450597719 675029617 315027614 635737834 439025757 505777670 590615658 142679716 637832921 847916068 472514213 71186529 723562195 273447466 297524284 782428382 428366719 869622434 528857976 735817391 650344824 152288845 779100871 130691934 584587742 513859676 996493379 687235989 189730396 ...

output:

579362183
459093435

result:

ok 2 number(s): "579362183 459093435"

Test #11:

score: 0
Accepted
time: 235ms
memory: 55576kb

input:

2
20000 10
770680455 822530420 615615204 314963433 892126521 815622197 900392916 410945746 187559247 278510970 538727855 101559225 98897919 326911775 760152822 689538526 60266407 256706575 791153240 418790216 772229976 194408266 426161021 328204862 71557913 976272337 111201197 504403438 188133891 58...

output:

30164141
385139412

result:

ok 2 number(s): "30164141 385139412"

Test #12:

score: 0
Accepted
time: 221ms
memory: 55560kb

input:

2
100000 2
224212357 458006968 163025536 269449920 699657932 932776912 420937536 166351734 685658904 344666962 946460500 884461444 228370491 174980092 646368291 854381092 617669653 366836379 717071379 463349902 749408189 163205331 665200568 666647060 230069001 195048922 357469436 37819596 212080713 ...

output:

188269415
372357321

result:

ok 2 number(s): "188269415 372357321"

Test #13:

score: 0
Accepted
time: 211ms
memory: 53724kb

input:

2
2 100000
242305209 73289374 463613125 946919872 154514343 546366969 34460325 132627880 629649815 379241632 14429790 612844256 207685982 530434285 412742360 761491236 249569341 450174989 677376758 146322726 339074943 507314636 10270834 864159988 715283525 729222953 772411491 19023116 374520280 8624...

output:

178386797
319825470

result:

ok 2 number(s): "178386797 319825470"

Test #14:

score: 0
Accepted
time: 98ms
memory: 14144kb

input:

2
1 200000
562387945 522780061 928236786 626145471 377386592 856211496 180201513 702883794 179376140 808080887 382633317 110998553 883255942 655659964 711334827 668601380 413687428 303285085 939672021 525550020 460960094 549434056 957565221 759683032 202253696 797371030 885363662 532445034 674913659...

output:

499141558
710898596

result:

ok 2 number(s): "499141558 710898596"

Extra Test:

score: 0
Extra Test Passed