結果
問題 | No.1193 Penguin Sequence |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:53:25 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 534 ms / 2,000 ms |
コード長 | 2,433 bytes |
コンパイル時間 | 445 ms |
コンパイル使用メモリ | 82,400 KB |
実行使用メモリ | 184,540 KB |
最終ジャッジ日時 | 2025-03-26 15:53:59 |
合計ジャッジ時間 | 15,347 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 38 |
ソースコード
MOD = 998244353def main():import sysinput = sys.stdin.read().split()N = int(input[0])A = list(map(int, input[1:N+1]))# Compute inv_count using Fenwick Treesorted_unique = sorted(list(set(A)))rank_dict = {v: i+1 for i, v in enumerate(sorted_unique)}max_rank = len(sorted_unique)class FenwickTree:def __init__(self, size):self.size = sizeself.tree = [0] * (self.size + 2)def update(self, idx, delta=1):while idx <= self.size:self.tree[idx] += deltaidx += idx & -idxdef query(self, idx):res = 0while idx > 0:res += self.tree[idx]idx -= idx & -idxreturn resfen = FenwickTree(max_rank)inv_count = 0for num in reversed(A):r = rank_dict[num]inv_count += fen.query(r - 1)fen.update(r)inv_count %= MOD# Compute total_pairssorted_A = sorted(A)total_pairs = 0for x in A:cnt = bisect.bisect_left(sorted_A, x)total_pairs += cnttotal_pairs %= MOD# Compute sum_i and sum_i_sqsum_i = N * (N + 1) // 2 % MODsum_i_sq = N * (N + 1) * (2 * N + 1) // 6 % MOD# Compute S = (sum_i^2 - sum_i_sq) / 2 mod MODS = (sum_i * sum_i - sum_i_sq) % MODS = S * pow(2, MOD-2, MOD) % MOD# Compute case1 and case2inv_N = pow(N, MOD-2, MOD) if N != 0 else 0inv_N_sq = inv_N * inv_N % MODcase1 = S * inv_N_sq % MODinv3 = pow(3, MOD-2, MOD)case2 = (N + 1) * inv3 % MOD# Compute product_Cmax_fact = Nfact = [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) % MODproduct_C = 1for k in range(1, N+1):c = fact[N] * inv_fact[k] % MODc = c * inv_fact[N - k] % MODproduct_C = product_C * c % MOD# Compute the final answerpart1 = case1 * total_pairs % MODpart2 = case2 * inv_count % MODtotal = (part1 + part2) % MODanswer = total * product_C % MODprint(answer)if __name__ == '__main__':import bisectmain()