結果
問題 | No.474 色塗り2 |
ユーザー | maspy |
提出日時 | 2020-01-02 13:05:13 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
AC
|
実行時間 | 1,210 ms / 2,000 ms |
コード長 | 1,493 bytes |
コンパイル時間 | 122 ms |
コンパイル使用メモリ | 12,800 KB |
実行使用メモリ | 269,992 KB |
最終ジャッジ日時 | 2024-05-02 06:26:44 |
合計ジャッジ時間 | 7,151 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1,137 ms
264,908 KB |
testcase_01 | AC | 1,073 ms
265,040 KB |
testcase_02 | AC | 1,105 ms
265,428 KB |
testcase_03 | AC | 1,210 ms
269,992 KB |
testcase_04 | AC | 1,109 ms
265,436 KB |
ソースコード
import sys read = sys.stdin.buffer.read readline = sys.stdin.buffer.readline readlines = sys.stdin.buffer.readlines import numpy as np N = int(readline()) ABC = np.array(read().split(),np.int64) A = ABC[::3] B = ABC[1::3] C = ABC[2::3] MOD = 1 << 20 # 二項係数 mod MODが必要。素因数 2 を無視して階乗を作る def cumprod(A, MOD = MOD): L = len(A); Lsq = int(L**.5+1) A = np.resize(A, Lsq**2).reshape(Lsq,Lsq) for n in range(1,Lsq): A[:,n] *= A[:,n-1]; A[:,n] %= MOD for n in range(1,Lsq): A[n] *= A[n-1,-1]; A[n] %= MOD return A.ravel()[:L] U = 1 << 22 x = np.arange(U, dtype = np.int64); x[0] = 1 n = 2 while n < U: x[n::n] //= 2 n *= 2 fact = cumprod(x, MOD) y = np.empty_like(x); y[1:] = x[1:][::-1] y[0] = pow(int(fact[-1]), MOD-1, MOD) # inverse fact_inv = cumprod(y, MOD)[::-1] def popcount_table(N): # N 未満の~~ L = (N-1).bit_length() A = np.zeros(1<<L,np.int32) for i in range(L): A[1<<i:1<<(i+1)] = A[:1<<i] + 1 return A[:N] popcount = popcount_table(U) """ ・D = C * comb(B+C-1,B) ・x = C * comb(A+D-1,A) ・x mod 2が知りたい。D mod MOD が知りたい。 """ D = fact[B+C-1] * fact_inv[B] * fact_inv[C-1] % MOD; D *= C; D %= MOD n = popcount[B] + popcount[C-1] - popcount[B+C-1] D <<= n; D %= MOD x = fact[A+D-1] * fact_inv[A] * fact_inv[D-1] % MOD; x *= C; x %= MOD n = popcount[A] + popcount[D-1] - popcount[A+D-1] x <<= n; x &= 1 print('\n'.join(x.astype(str)))