QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#72094#622. 多项式多点求值Qingyu0 905ms41816kbC++233.9kb2023-01-14 00:24:312023-01-14 00:24:33

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-01-14 00:24:33]
  • 评测
  • 测评结果:0
  • 用时:905ms
  • 内存:41816kb
  • [2023-01-14 00:24:31]
  • 提交

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...

output:


result: