QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#72091 | #622. 多项式多点求值 | Qingyu | 0 | 1306ms | 41108kb | C++23 | 3.9kb | 2023-01-14 00:19:16 | 2023-01-14 00:19:20 |
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 * 3];
poly f = polyinv(a, mid);
f.resize(mxlen), a.resize(mxlen);
dft(f, mxlen), dft(a, mxlen);
for(int i = 0; i < mxlen; i ++) f[i] = sub(2ll * f[i] % mod, 1ll * f[i] * f[i] % mod * a[i] % 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: 3ms
memory: 20284kb
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:
871209652 937929160 460324803 490352555 246855408 362694921 772418007 83116982 319523354 695415352 198532508 714040570 648830843 644676914 596261365 947763107 611023228 465578001 975784011 588331850 24829908 823777203 926956610 69530883 820495006 19956095 994146054 379398409 446811175 80555777 23364...
result:
wrong answer 1st numbers differ - expected: '940122667', found: '871209652'
Test #2:
score: 0
Wrong Answer
time: 34ms
memory: 20952kb
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:
977663369 765337142 67689056 755350135 415800819 167559386 847044786 670489889 386448974 478734782 167377300 855437005 692965546 689870618 712895126 922541615 513448234 321981893 397359972 817354833 236782410 317549553 379699194 149957493 439886891 919574385 791885212 276454746 64447490 537933893 61...
result:
wrong answer 1st numbers differ - expected: '683038054', found: '977663369'
Test #3:
score: 0
Wrong Answer
time: 277ms
memory: 25164kb
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:
33062490 855798352 783002238 35969522 544889772 141350827 600293617 396056708 139015593 637303002 784650413 26338904 639917123 275268193 98147736 153034789 8355610 594517547 386515881 731499589 88448444 210118340 850067516 285670441 72556672 61684973 696606306 329500674 754398740 676122627 450163133...
result:
wrong answer 1st numbers differ - expected: '319541931', found: '33062490'
Test #4:
score: 0
Wrong Answer
time: 1306ms
memory: 41108kb
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:
862421151 902434305 957470441 716273818 740278009 787094739 852922471 35358211 903496234 507003897 805218028 3449007 238355153 882887531 662754044 699506376 234890205 128517077 451052646 257661475 169178192 105293139 155459823 540060567 578065714 357774660 442692970 968020082 630474973 827259670 697...
result:
wrong answer 1st numbers differ - expected: '135579851', found: '862421151'
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...