ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#200801 | #2295. permanent | Anonyme | 100 | 4688ms | 16432kb | C++11 | 2.5kb | 2024-01-13 08:37:03 | 2024-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