結果
| 問題 |
No.3041 非対称じゃんけん
|
| ユーザー |
|
| 提出日時 | 2025-02-28 22:56:15 |
| 言語 | JavaScript (node v23.5.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,143 bytes |
| コンパイル時間 | 95 ms |
| コンパイル使用メモリ | 8,232 KB |
| 実行使用メモリ | 82,376 KB |
| 最終ジャッジ日時 | 2025-02-28 22:56:22 |
| 合計ジャッジ時間 | 7,773 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 3 WA * 6 TLE * 1 -- * 20 |
ソースコード
class Convolution {
static fft(re, im, inv) {
const n = re.length;
for (let i = 1, j = 0; i < n; i++) {
let bit = n >> 1;
for (; j & bit; bit >>= 1) j -= bit;
j += bit;
if (i < j) {
[re[i], re[j]] = [re[j], re[i]];
[im[i], im[j]] = [im[j], im[i]];
}
}
for (let len = 2; len <= n; len <<= 1) {
const ang = ((2 * Math.PI) / len) * (inv ? -1 : 1);
const wlen_re = Math.cos(ang);
const wlen_im = Math.sin(ang);
for (let i = 0; i < n; i += len) {
let w_re = 1,
w_im = 0;
for (let j = 0; j < len >> 1; j++) {
const u_re = re[i + j], u_im = im[i + j];
const v_re = re[i + j + (len >> 1)] * w_re - im[i + j + (len >> 1)] * w_im;
const v_im = re[i + j + (len >> 1)] * w_im + im[i + j + (len >> 1)] * w_re;
re[i + j] = u_re + v_re;
im[i + j] = u_im + v_im;
re[i + j + (len >> 1)] = u_re - v_re;
im[i + j + (len >> 1)] = u_im - v_im;
const next_w_re = w_re * wlen_re - w_im * wlen_im;
const next_w_im = w_re * wlen_im + w_im * wlen_re;
w_re = next_w_re;
w_im = next_w_im;
}
}
}
if (inv) for (let i = 0; i < n; i++) re[i] /= n, im[i] /= n;
}
static convolution(a, b) {
const n = a.length, m = b.length;
let size = 1;
while (size < n + m - 1) size <<= 1;
const A_re = new Array(size).fill(0);
const A_im = new Array(size).fill(0);
const B_re = new Array(size).fill(0);
const B_im = new Array(size).fill(0);
for (let i = 0; i < n; i++) A_re[i] = a[i];
for (let i = 0; i < m; i++) B_re[i] = b[i];
this.fft(A_re, A_im, false);
this.fft(B_re, B_im, false);
for (let i = 0; i < size; i++) {
const temp_re = A_re[i] * B_re[i] - A_im[i] * B_im[i];
const temp_im = A_re[i] * B_im[i] + A_im[i] * B_re[i];
A_re[i] = temp_re;
A_im[i] = temp_im;
}
this.fft(A_re, A_im, true);
const res = new Array(n + m - 1);
for (let i = 0; i < n + m - 1; i++) res[i] = Math.round(A_re[i]);
return res;
}
}
function Main(input) {
const [[N, F], A, B, C] = input.split("\n").map(e => e.split(" ").map(Number));
const ans = [];
const ABC = [];
for (let i = 0; i < N; i++) {
const arr = new Array(Math.max(F + 1)).fill(0);
arr[A[i]]++;
arr[B[i]]++;
arr[C[i]]++;
ABC.push(arr);
}
let line = ABC[0];
ans.push(new Set([A[0], B[0], C[0]]).size);
for (let i = 1; i < N; i++) {
const tmp = Convolution.convolution(line, ABC[i]);
let cnt = 0;
for (const num of tmp) if (num > 0) cnt++;
ans.push(cnt);
line = tmp;
}
console.log(ans.join("\n"));
}
Main(require("fs").readFileSync(0)+"")