結果
問題 |
No.1428 PeRmutation Question
|
ユーザー |
![]() |
提出日時 | 2025-04-16 15:57:02 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,884 bytes |
コンパイル時間 | 522 ms |
コンパイル使用メモリ | 82,220 KB |
実行使用メモリ | 84,912 KB |
最終ジャッジ日時 | 2025-04-16 15:59:51 |
合計ジャッジ時間 | 4,544 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 25 WA * 5 |
ソースコード
MOD = 10**9 + 7 def main(): import sys input = sys.stdin.read().split() n = int(input[0]) p = list(map(int, input[1:n+1])) visited = [False] * (n + 1) cycle_freq = {} for i in range(1, n+1): if not visited[i]: cnt = 0 j = i while not visited[j]: visited[j] = True j = p[j-1] cnt += 1 if cnt not in cycle_freq: cycle_freq[cnt] = 0 cycle_freq[cnt] += 1 has_even = False has_odd_multiple = False for l in cycle_freq: if l % 2 == 0: has_even = True break if cycle_freq[l] >= 2: has_odd_multiple = True break if has_even or has_odd_multiple: fact = [1] * (n + 1) for i in range(1, n+1): fact[i] = fact[i-1] * i % MOD denominator = 1 for l in cycle_freq: m = cycle_freq[l] term = pow(l, m, MOD) term = term * pow(fact[m], 1, MOD) % MOD denominator = denominator * term % MOD inv_denominator = pow(denominator, MOD-2, MOD) K = fact[n] * inv_denominator % MOD print(K % MOD) else: fact = [1] * (n + 1) for i in range(1, n+1): fact[i] = fact[i-1] * i % MOD denominator = 1 for l in cycle_freq: m = cycle_freq[l] term = pow(l, m, MOD) term = term * pow(fact[m], 1, MOD) % MOD denominator = denominator * term % MOD inv_denominator = pow(denominator, MOD-2, MOD) K = fact[n] * inv_denominator % MOD if K % 2 == 0: res = K * pow(2, MOD-2, MOD) % MOD else: res = 1 print(res % MOD) if __name__ == '__main__': main()