結果
問題 | No.1839 Concatenation Matrix |
ユーザー |
![]() |
提出日時 | 2025-03-31 18:01:09 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,089 bytes |
コンパイル時間 | 185 ms |
コンパイル使用メモリ | 82,668 KB |
実行使用メモリ | 190,096 KB |
最終ジャッジ日時 | 2025-03-31 18:02:15 |
合計ジャッジ時間 | 5,045 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 4 WA * 12 |
ソースコード
MOD = 998244353PHI = MOD - 1def main():import sysinput = sys.stdin.readdata = input().split()n = int(data[0])a = list(map(int, data[1:n+1]))current = [x % MOD for x in a]k = min(23, n-1)for step in range(1, k+1):expon = 1 << (step-1)multiplier = pow(10, expon, MOD)next_current = []for j in range(n):nj = (j + 1) % nval = (current[j] * multiplier + current[nj]) % MODnext_current.append(val)current = next_currentremaining_steps = (n-1) - kif remaining_steps > 0:m = remaining_stepsmax_fact = mfact = [1] * (max_fact + 1)for i in range(1, max_fact + 1):fact[i] = fact[i-1] * i % MODinv_fact = [1] * (max_fact + 1)inv_fact[max_fact] = pow(fact[max_fact], MOD-2, MOD)for i in range(max_fact -1, -1, -1):inv_fact[i] = inv_fact[i+1] * (i+1) % MODdef comb(m, k):if k <0 or k > m:return 0return fact[m] * inv_fact[k] % MOD * inv_fact[m - k] % MODG = [0] * nfor k in range(0, m + 1):pos = k % nG[pos] = (G[pos] + comb(m, k)) % MODdef ntt(a, invert=False):n = len(a)rev = list(range(n))for i in range(1, n):rev[i] = rev[i >> 1] >> 1if i & 1:rev[i] |= n >> 1if i < rev[i]:a[i], a[rev[i]] = a[rev[i]], a[i]log_n = (n).bit_length() - 1root = pow(3, (MOD - 1) // n, MOD) if not invert else pow(3, MOD-1 - (MOD -1) // n, MOD)roots = [1] * (n // 2)for i in range(1, len(roots)):roots[i] = roots[i-1] * root % MODfor m in range(1, log_n + 1):m_h = 1 << (m-1)m_len = m_h << 1for i in range(0, n, m_len):for j in range(m_h):u = a[i + j]v = a[i + j + m_h] * roots[j * (n >> m)] % MODa[i + j] = (u + v) % MODa[i + j + m_h] = (u - v) % MODif invert:inv_n = pow(n, MOD-2, MOD)for i in range(n):a[i] = a[i] * inv_n % MODreturn asize = 1while size < n:size <<= 1size <<= 1a_pad = current[:] + [0] * (size - n)g_pad = G[:] + [0] * (size - n)a_pad_ntt = ntt(a_pad.copy())g_pad_ntt = ntt(g_pad.copy())conv_ntt = [ (a * b) % MOD for a, b in zip(a_pad_ntt, g_pad_ntt)]conv = ntt(conv_ntt, invert=True)result = [0] * nfor i in range(n):result[i] = (conv[i] + conv[i + n]) % MODcurrent = resultfor x in current:print(x)if __name__ == '__main__':main()