提交记录 16829


用户 题目 状态 得分 用时 内存 语言 代码长度
Saisyc 1002i. 【模板题】多项式乘法 Wrong Answer 0 28.368 ms 17196 KB C++ 2.60 KB
提交时间 评测时间
2021-10-25 15:31:27 2021-10-25 15:31:31
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cmath>

namespace fastIO {
    const int SZ = 1 << 25;
    char ibuf[SZ], *p0 = ibuf, *p1 = ibuf;
    inline 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;
    inline void putchar(char char_write) { *p++ = char_write; }
    void write(auto val) { if(val >= 10) write(val / 10); putchar(val % 10 + '0'); }
    inline 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 float PI = acos(-1);

struct CMPLX {
	double a, b; // a + bi
	CMPLX operator + (CMPLX z)  const { return (CMPLX){ a + z.a, b + z.b}; }
	CMPLX operator - (CMPLX z)  const { return (CMPLX){ a - z.a, b - z.b}; }
	CMPLX operator * (CMPLX z)  const { return (CMPLX){ a * z.a - b * z.b, a * z.b + b * z.a}; }
} c[N];

CMPLX w[N + 1];

CMPLX fft_sup[N];
inline void fft(auto a[], int n) {
	auto b = fft_sup, j = a, _j = a; int i, k, _k; auto _w = w;
	for(i = 1; i < n; i <<= 1, std :: swap(a, b))
		for(k = 0, j = a, _j = a + (n >> 1), _w = w; k != n; k += i, _w += i)
			for(_k = k, k += i; _k != k; ++j, ++_j, ++_k)
				b[_k] = *j + *_j,
				b[_k + i] = (*j - *_j) * *_w;
	if(b != fft_sup) std :: copy(a, a + n, b);
}
inline void ifft(auto a[], int n) {
	auto b = fft_sup, j = a, _j = a; int i, k, _k; auto _w = w;
	for(i = 1; i < n; i <<= 1, std :: swap(a, b))
		for(k = 0, j = a, _j = a + (n >> 1), _w = w + n; k != n; k += i, _w -= i)
			for(_k = k, k += i; _k != k; ++j, ++_j, ++_k)
				b[_k] = *j + *_j,
				b[_k + i] = (*j - *_j) * *_w;
	if(b != fft_sup) std :: copy(a, a + n, b);
}
inline void poly_mul(auto a[], auto b[], int n) {
	CMPLX _w = (CMPLX){ cos(PI / n * 2), sin(PI / n * 2)};
	w[0].a = 1; for(int i = 1; i <= n; ++i) w[i] = w[i - 1] * _w;
	for(int i = 0; i < n; ++i) c[i].a = a[i], c[i].b = b[i]; fft(c, n);
	for(int i = 0; i < n; ++i) c[i] = c[i] * c[i]; ifft(c, n);
	float _n = 0.5 / n; for(int i = 0; i < n; ++i) a[i] = c[i].b * _n + 0.123;
}

int n, n_a, n_b;
int 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.93 us40 KBAcceptedScore: 0

Subtask #1 Testcase #228.141 ms16 MB + 648 KBWrong AnswerScore: 0

Subtask #1 Testcase #39.983 ms7 MB + 664 KBWrong AnswerScore: 0

Subtask #1 Testcase #49.985 ms7 MB + 268 KBWrong AnswerScore: 0

Subtask #1 Testcase #510.29 us40 KBAcceptedScore: 0

Subtask #1 Testcase #68.88 us40 KBAcceptedScore: 0

Subtask #1 Testcase #79.73 us40 KBAcceptedScore: 0

Subtask #1 Testcase #827.257 ms16 MB + 48 KBWrong AnswerScore: 0

Subtask #1 Testcase #927.293 ms15 MB + 940 KBWrong AnswerScore: 0

Subtask #1 Testcase #1026.491 ms15 MB + 336 KBWrong AnswerScore: 0

Subtask #1 Testcase #1128.368 ms16 MB + 812 KBWrong AnswerScore: 0

Subtask #1 Testcase #1225.053 ms14 MB + 568 KBAcceptedScore: 0

Subtask #1 Testcase #138.15 us40 KBAcceptedScore: 0


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