UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#200801#2295. permanentAnonyme1004688ms16432kbC++112.5kb2024-01-13 08:37:032024-01-13 17:23:43

answer

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

#define QwQ330AwA return 0
#define ll long long

const int mod = 998244353;
namespace Poly {
	const int N = 1e6 + 5;
	int rev[N], pw[N];
	int len, lg;
	int ksm(int a, int b) {
		int ans = 1;
		for (; b; b >>= 1, a = 1ll * a * a % mod) {
			if (b & 1) ans = 1ll * ans * a % mod;
		}
		return ans;
	}
	void init() {
		for (int i = 0; i < len; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (lg - 1));
		for (int mid = 1; mid < len; mid *= 2) {
			pw[mid] = 1;
			pw[mid + 1] = ksm(3, (mod - 1) / (mid * 2));
			for (int j = 2; j < mid; j++) {
				pw[mid + j] = 1ll * pw[mid + j - 1] * pw[mid + 1] % mod;
			}
		}
	}
	void NTT(vector <int> &f, int op) {
		for (int i = 0; i < len; i++) {
			if (i < rev[i]) swap(f[i], f[rev[i]]);
		}
		for (int mid = 1; mid < len; mid *= 2) {
			for (int i = 0; i < len; i += mid * 2) {
				for (int j = 0; j < mid; j++) {
					int x = f[i + j], y = 1ll * pw[mid + j] * f[i + j + mid] % mod;
					f[i + j] = x + y;
					if (f[i + j] >= mod) f[i + j] -= mod;
					f[i + j + mid] = x - y;
					if (f[i + j + mid] < 0) f[i + j + mid] += mod;
				}
			}
		}
		if (op == -1) {
			int inv = ksm(len, mod - 2);
			for (int i = 0; i < len; i++) f[i] = 1ll * f[i] * inv % mod;
			reverse(f.begin() + 1, f.begin() + len);
		}
	}
	vector <int> poly_mul(vector <int> f, vector <int> g) {
		int n = f.size(), m = g.size();
		len = 1, lg = 0;
		while (len <= n + m) len *= 2, lg++;
		init();
		while ((int)f.size() < len) f.push_back(0);
		while ((int)g.size() < len) g.push_back(0);
		NTT(f, 1);
		NTT(g, 1);
		for (int i = 0; i < len; i++) f[i] = 1ll * f[i] * g[i] % mod;
		NTT(f, -1);
		while ((int)f.size() > n + m) f.pop_back();
		return f;
	}
}

int n, m;
int dp[200005];
queue < vector <int> > q;

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m;
	dp[0] = 1, dp[1] = 0, dp[2] = 1;
	for (int i = 3; i <= n + m - 1; i++) dp[i] = 1ll * (i - 1) * (dp[i - 2] + dp[i - 1]) % mod;
	for (int i = 1, w; i <= n; i++) {
		cin >> w;
		vector <int> now;
		now.push_back(1);
		now.push_back(w);
		q.push(now);
	}
	while (q.size() > 1) {
		auto f = q.front();
		q.pop();
		auto g = q.front();
		q.pop();
		q.push(Poly :: poly_mul(f, g));
	}
	auto f = q.front();
	vector <int> g;
	for (int i = 0; i <= n + m - 1; i++) g.push_back(dp[i]);
	f = Poly :: poly_mul(f, g);
	for (int i = n; i <= n + m - 1; i++) cout << f[i] << '\n';
	QwQ330AwA;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

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

input:

5 5
757147 851000 413356 971124 598368

output:

369367664
721579075
290092761
301050893
630695539

result:

ok 5 lines

Test #2:

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

input:

30 30
567225 749387 890851 766290 239572 38164 597006 615544 51436 289610 341522 427798 215528 16433...

output:

897823300
248221410
3801459
677676919
931057287
73976562
374794207
467137782
760116421
299008265
382...

result:

ok 30 lines

Test #3:

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

input:

299 300
352030 923810 79500 701606 546364 776867 572136 71040 629216 496748 646416 840198 255906 557...

output:

641902489
21999633
83085478
288916261
400329143
386778408
460897617
421648812
889936200
62127620
159...

result:

ok 300 lines

Test #4:

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

input:

300 299
934265 115160 740784 137987 955200 664124 678244 417747 41647 269960 416462 192277 526845 46...

output:

59263362
962274997
235075952
760746781
808356174
515096845
41379401
371604990
316853173
960195933
54...

result:

ok 299 lines

Test #5:

score: 10
Accepted
time: 16ms
memory: 1576kb

input:

2000 2000
307387 416826 690456 254684 784986 337968 843420 733792 948250 45464 222013 718362 366236 ...

output:

320392
239060567
51038021
826311595
660161685
682156502
516299175
969345036
456432731
300114311
1766...

result:

ok 2000 lines

Test #6:

score: 10
Accepted
time: 47ms
memory: 2032kb

input:

5000 4999
480497 836350 321420 208085 980705 95634 282767 485780 17380 585205 720894 606200 158025 5...

output:

321540828
363149382
685463737
728169049
398570418
623763190
843924428
281900391
327618122
440654611
...

result:

ok 4999 lines

Test #7:

score: 10
Accepted
time: 722ms
memory: 8940kb

input:

50000 50000
290490 977114 774420 456738 436816 478644 851245 333088 433774 475784 93240 493930 69511...

output:

209455244
25273022
892040830
861750409
601449291
560077871
592961385
642599841
993579574
420764191
4...

result:

ok 50000 lines

Test #8:

score: 10
Accepted
time: 724ms
memory: 8932kb

input:

50000 100000
906446 916202 261886 302704 650240 153406 858090 896928 83849 122521 162952 614895 9015...

output:

676791084
240782913
196551464
596992001
735901941
217024864
102567405
484629923
616362346
404888936
...

result:

ok 100000 lines

Test #9:

score: 10
Accepted
time: 1582ms
memory: 15780kb

input:

100000 50000
340112 804118 805490 122840 139771 924000 91638 314718 106688 854474 313872 586656 5543...

output:

817793895
930973656
832284886
543974607
968644145
332504492
333389313
79380137
365506325
409771156
6...

result:

ok 50000 lines

Test #10:

score: 10
Accepted
time: 1591ms
memory: 16432kb

input:

100000 100000
893600 986490 222944 36801 213664 3555 965883 816416 785200 844041 39040 739920 995848...

output:

843740843
594770135
886666247
131706519
642723668
310064760
342864248
850106455
377321556
675298201
...

result:

ok 100000 lines