提交记录 16816


用户 题目 状态 得分 用时 内存 语言 代码长度
Saisyc 1002i. 【模板题】多项式乘法 Accepted 100 44.432 ms 9632 KB C++ 2.33 KB
提交时间 评测时间
2021-10-24 21:41:13 2021-10-24 21:41:16
#include <cstdio>
#include <cctype>
#include <algorithm>

namespace fastIO {
    const int SZ = 1 << 25;
    char ibuf[SZ], *p0 = ibuf, *p1 = ibuf;
    char getchar(void) { return p0 == p1 && (p1 = (p0 = ibuf) + fread(ibuf, 1, SZ, stdin), p0 == p1) ? EOF : *p0++; }
    char char_read; void read(auto &val) {
		val = 0; do char_read = getchar(); while(!isdigit(char_read));
		do val = val * 10 + char_read - '0'; while(isdigit(char_read = getchar()));
    }
    char obuf[SZ], *p = obuf;
    void putchar(char char_write) { *p++ = char_write; }
    void write(auto val) { if(val >= 10) write(val / 10); putchar(val % 10 + '0'); }
    void write(auto a[], int sz) { for(int i = 0; i < sz; ++i) write(a[i]), putchar(' '); putchar('\n'); }
    void output(void) { fwrite(obuf, p - obuf, 1, stdout);}
};

const int N = 1 << 21;
const long long p = 2748779069441ll;
const long long g = 3;
const long long h = 916259689814ll;

long long mul_modp(long long a, long long b) {
	return a * b - (long long)((long double)a * b / p) * p;
}

long long pow_modp(long long a, long long b) { long long x = 1; for(; b; a = mul_modp(a, a), b >>= 1) if(b & 1) x = mul_modp(x, a) % p; return x; }

long long ntt_sup[N];
void ntt(auto a[], int n, long long w) {
	auto ntt_a = ntt_sup, j = a, _j = a; int i, k, _k; long long _w;
	for(i = 1; i < n; i <<= 1, w = mul_modp(w, w), std :: swap(a, ntt_a))
		for(k = 0, j = a, _j = a + (n >> 1), _w = 1; k != n; k += i, _w = mul_modp(_w, w))
			for(_k = k, k += i; _k != k; ++j, ++_j, ++_k)
				ntt_a[_k] = *j + *_j < 0 ? *j + *_j + p : *j + *_j - p,
				ntt_a[_k + i] = mul_modp(*j - *_j, _w);
	if(ntt_a != ntt_sup) std :: copy(a, a + n, ntt_a);
}
void poly_mul(auto a[], auto b[], long long n) {
	ntt(a, n, pow_modp(g, (p - 1) / n)), ntt(b, n, pow_modp(g, (p - 1) / n));
	for(int i = 0; i < n; ++i) a[i] = mul_modp(a[i], b[i]); ntt(a, n, pow_modp(h, (p - 1) / n));
	long long inv_n = pow_modp(n, p - 2); for(long long i = 0; i < n; ++i) a[i] = mul_modp(a[i], inv_n);
	for(int i = 0; i < n; ++i) a[i] = a[i] < 0 ? a[i] + p : a[i];
}

int n, n_a, n_b;
long long a[N], b[N];

int main(void) {
	fastIO :: read(n_a), fastIO :: read(n_b); for(n = 1; n <= n_a + n_b; n <<= 1);
	for(int i = 0; i <= n_a; ++i) fastIO :: read(a[i]);
	for(int i = 0; i <= n_b; ++i) fastIO :: read(b[i]);
	poly_mul(a, b, n);
	fastIO :: write(a, n_a + n_b + 1), fastIO :: output();
	return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #18.82 us32 KBAcceptedScore: 0

Subtask #1 Testcase #243.814 ms9 MB + 252 KBAcceptedScore: 100

Subtask #1 Testcase #319.978 ms3 MB + 788 KBAcceptedScore: 0

Subtask #1 Testcase #420.029 ms3 MB + 768 KBAcceptedScore: 0

Subtask #1 Testcase #59.85 us32 KBAcceptedScore: 0

Subtask #1 Testcase #69.12 us32 KBAcceptedScore: 0

Subtask #1 Testcase #79.44 us32 KBAcceptedScore: 0

Subtask #1 Testcase #843.344 ms8 MB + 676 KBAcceptedScore: 0

Subtask #1 Testcase #943.311 ms8 MB + 676 KBAcceptedScore: 0

Subtask #1 Testcase #1042.482 ms8 MB + 72 KBAcceptedScore: 0

Subtask #1 Testcase #1144.432 ms9 MB + 416 KBAcceptedScore: 0

Subtask #1 Testcase #1240.588 ms7 MB + 172 KBAcceptedScore: 0

Subtask #1 Testcase #138.97 us32 KBAcceptedScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-03-18 14:43:39 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠