QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#72094 | #622. 多项式多点求值 | Qingyu | 0 | 905ms | 41816kb | C++23 | 3.9kb | 2023-01-14 00:24:31 | 2023-01-14 00:24:33 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
constexpr int mod = 998244353, G = 3;
using poly = vector<int>;
constexpr int maxn = 1 << 18, N = (1 << 18) + 10;
int w[N], inv[N], lg[N], rev[N];
inline int add(int a, int b) {return (a += b - mod), a += a >> 31 & mod;}
inline int sub(int a, int b) {return (a -= b), a += a >> 31 & mod;}
inline int fpw(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() {
inv[1] = 1;
for(int i = 2; i < N; i ++) lg[i] = lg[i + 1 >> 1] + 1;
for(int i = 2; i < N; i ++) inv[i] = 1ll * inv[mod % i] * (mod - mod / i) % mod;
int wn = fpw(G, (mod - 1) / maxn); w[0] = 1;
for(int i = 1; i < N; i ++) w[i] = 1ll * wn * w[i - 1] % mod;
}
void dft(poly &a, int len) {
for(int i = len >> 1; i >= 1; i >>= 1) {
int s = maxn / (i << 1);
for(int j = 0; j < len; j += i << 1) {
for(int k = 0, *p = w; k < i; k ++, p += s) {
int x = a[j + k], y = a[i + j + k];
a[j + k] = add(x, y);
a[i + j + k] = 1ll * *p * sub(x, y) % mod;
}
}
}
}
void idft(poly &a, int len) {
for(int i = 1; i < len; i <<= 1) {
int s = maxn / (i << 1);
for(int j = 0; j < len; j += i << 1) {
for(int k = 0, *p = w; k < i; k ++, p += s) {
int x = a[j + k], y = 1ll * *p * a[i + j + k] % mod;
a[j + k] = add(x, y);
a[i + j + k] = sub(x, y);
}
}
}
reverse(a.begin() + 1, a.end());
for(int &x : a) x = 1ll * x * inv[len] % mod;
}
poly polymul(poly a, poly b, int len) {
if(a.size() > len) a.resize(len);
if(b.size() > len) b.resize(len);
if(len <= 40) {
poly c(len);
for(int i = 0; i < a.size(); i ++) {
for(int j = 0; j < min(len - i, int(b.size())); j ++) {
c[i + j] = add(c[i + j], 1ll * a[i] * b[j] % mod);
}
}
return c;
}
int mxlen = 1 << lg[a.size() + b.size() - 1];
a.resize(mxlen), b.resize(mxlen);
dft(a, mxlen), dft(b, mxlen);
for(int i = 0; i < mxlen; i ++) a[i] = 1ll * a[i] * b[i] % mod;
idft(a, mxlen), a.resize(len);
return a;
}
poly polyinv(poly a, int len) {
if(len == 1) return poly{fpw(a[0], mod - 2)};
int mid = len + 1 >> 1, mxlen = 1 << lg[len * 2];
poly f = polyinv(a, mid);
f.resize(mxlen), a.resize(mxlen);
dft(f, mxlen), dft(a, mxlen);
for (int i = 0; i < mxlen; ++i) a[i] = (1ll * a[i] * f[i] - 1 + mod) % mod;
for (int i = 0; i < mxlen; ++i) f[i] = 1ll * f[i] * (1 - a[i] + mod) % mod;
idft(f, mxlen); f.resize(len);
return f;
}
void qiudao(poly &a, int len) {
for(int i = 0; i < len - 1; i ++) a[i] = 1ll * a[i + 1] * (i + 1) % mod;
}
void jifen(poly &a, int len) {
for(int i = len - 1; i >= 1; i --) a[i] = 1ll * a[i - 1] * inv[i] % mod;
a[0] = 0;
}
poly polydiv(poly a, poly b) {
int n = a.size(), m = b.size();
reverse(a.begin(), a.end()), reverse(b.begin(), b.end());
b.resize(n - m + 1);
poly p = polymul(a, polyinv(b, n - m + 1), n - m + 1);
reverse(p.begin(), p.end());
return p;
}
poly polymod(poly a, poly b) {
int n = a.size(), m = b.size();
if(n < m) return a;
poly p = polydiv(a, b);
poly q = polymul(b, p, m - 1);
for(int i = 0; i < m - 1; i ++) q[i] = sub(a[i], q[i]);
return q;
}
poly sum[N << 1];
int x[N], y[N];
#define ls u << 1
#define rs u << 1 | 1
void dfs1(int u, int l, int r) {
if(l == r) {
sum[u] = {mod - x[l], 1};
} else {
int mid = l + r >> 1;
dfs1(ls, l, mid), dfs1(rs, mid + 1, r);
sum[u] = polymul(sum[ls], sum[rs], r - l + 2);
}
}
void dfs2(int u, int l, int r, poly f) {
f = polymod(f, sum[u]);
if(l == r) {
y[l] = f[0];
} else {
int mid = l + r >> 1;
dfs2(ls, l, mid, f), dfs2(rs, mid + 1, r, f);
}
}
#undef ls
#undef rs
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0);
init();
int n, m;
cin >> n >> m;
poly f(n), a(m);
for(int &x : f) cin >> x;
for(int i = 0; i < m; i ++) cin >> x[i];
dfs1(1, 0, m - 1);
dfs2(1, 0, m - 1, f);
for(int i = 0; i < m; i ++) cout << y[i] << '\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 5ms
memory: 20288kb
input:
100 94 575336069 33153864 90977269 80162592 25195235 334936051 108161572 14050526 356949084 797375084 805865808 286113858 995555121 938794582 458465004 379862532 563357556 293989886 273730531 13531923 113366106 126368162 405344025 443053020 475686818 734878619 338356543 661401660 834651229 527993675...
output:
552053817 551753984 573465111 487008922 946769656 286487872 344753282 547151216 551194638 237373826 580156567 593311819 943683051 369591317 425616239 389048325 410216340 160603862 27509808 859097515 469239192 63717768 973192601 628507339 895580812 785850686 358246970 432414714 639586357 792855242 47...
result:
wrong answer 1st numbers differ - expected: '940122667', found: '552053817'
Test #2:
score: 0
Wrong Answer
time: 40ms
memory: 22620kb
input:
5000 4999 410683245 925831211 726803342 144364185 955318244 291646122 334752751 893945905 484134283 203760731 533867267 813509277 491860093 413174124 584582617 594704162 976489328 978500071 196938934 628117769 169796671 858963950 562124570 582491326 647830593 238623335 20782490 674939336 656529076 2...
output:
598897613 321754978 98395899 483881636 44623499 757984549 344504424 406379990 528291934 50322483 93037598 614610471 42369060 354160793 208662890 504575757 509830138 946556786 11614332 585203299 865417499 307203077 310090508 199102114 666208898 277058391 315839853 597000657 198386802 130285473 415910...
result:
wrong answer 1st numbers differ - expected: '683038054', found: '598897613'
Test #3:
score: 0
Wrong Answer
time: 203ms
memory: 26212kb
input:
30000 29995 536696866 881441742 356233606 594487396 991820796 695996817 7219464 149265950 843761437 329761701 260625152 80366362 598729314 133794090 12808683 67477659 320740422 878134577 879383179 940923483 660160621 18082378 886078389 524050341 35092018 137623841 988429688 258507355 138475726 75726...
output:
893609453 772520461 684243843 398538018 813764267 443167510 330713753 179287027 668088486 852729541 112315540 817153103 453229622 374591614 640710596 253368804 283893570 202853754 513671101 61826470 534085581 882219014 899162758 718736157 205213096 980846197 223606820 38396332 135299218 801002463 14...
result:
wrong answer 1st numbers differ - expected: '319541931', found: '893609453'
Test #4:
score: 0
Wrong Answer
time: 905ms
memory: 41816kb
input:
100000 99989 703908936 826436271 431732352 607460686 960390248 897906950 506352459 662618885 172508812 713410533 704313866 156459539 879660919 98030681 46358006 400134234 121190289 498201666 616888945 210891377 39623412 687350951 269444705 980768130 381802923 553892268 644461704 287608268 554761733 ...
output:
266562720 992419143 721599405 471004482 225789887 532454659 506795317 146121792 768355634 233983280 587450689 355472576 883733894 439996792 719172953 93878854 656902444 852668695 415400920 726736467 731782725 539786753 266851804 432469699 805733560 310293578 241104424 322018308 246565035 637511708 8...
result:
wrong answer 1st numbers differ - expected: '135579851', found: '266562720'
Test #5:
score: 0
Runtime Error
input:
1000000 999998 326289172 459965021 432610030 381274775 890620650 133203219 755508578 820410129 100497878 978894337 34545975 484258543 341383383 556328539 705716773 985485996 201697555 806763870 456757110 445252781 501965590 655584951 516373423 475444481 554722275 106826011 433893131 385018453 687541...