結果
問題 | No.1978 Permutation Repetition |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:52:42 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 99 ms / 2,000 ms |
コード長 | 2,824 bytes |
コンパイル時間 | 244 ms |
コンパイル使用メモリ | 81,908 KB |
実行使用メモリ | 84,496 KB |
最終ジャッジ日時 | 2025-03-26 15:53:13 |
合計ジャッジ時間 | 4,442 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 44 |
ソースコード
import sysimport mathfrom collections import defaultdictMOD = 10**9 + 7def main():N, M = map(int, sys.stdin.readline().split())A = list(map(int, sys.stdin.readline().split()))A = [a - 1 for a in A] # 0-based index# Precompute combinations and factorials up to 1000max_n = 1000comb = [[0] * (max_n + 1) for _ in range(max_n + 1)]comb[0][0] = 1for i in range(1, max_n + 1):comb[i][0] = 1for j in range(1, i + 1):comb[i][j] = (comb[i-1][j-1] + comb[i-1][j]) % MODfact = [1] * (max_n + 1)for i in range(1, max_n + 1):fact[i] = fact[i-1] * i % MOD# Function to get all divisors of Mdef get_divisors(M):factors = {}temp = Mi = 2while i * i <= temp:while temp % i == 0:factors[i] = factors.get(i, 0) + 1temp //= ii += 1if temp > 1:factors[temp] = 1divisors = [1]for p in factors:exponents = []current = 1for _ in range(factors[p]):current *= pexponents.append(current)new_divisors = []for d in divisors:for e in exponents:new_divisors.append(d * e)divisors += new_divisorsdivisors = list(set(divisors))divisors.sort()return divisorsdivisors_M = get_divisors(M)# Decompose A into cyclesvisited = [False] * Ncnt = defaultdict(int)for i in range(N):if not visited[i]:cycle_len = 0current = iwhile not visited[current]:visited[current] = Truecurrent = A[current]cycle_len += 1cnt[cycle_len] += 1# Calculate answeranswer = 1for k in cnt:c = cnt[k]valid_g = []for g in divisors_M:if M % g != 0:continue # should not happen as divisors_M are divisors of Mm_over_g = M // gif math.gcd(k, m_over_g) == 1:valid_g.append(g)valid_g.sort()dp = [0] * (c + 1)dp[0] = 1for i in range(1, c + 1):for g in valid_g:if g > i:continueways = comb[i-1][g-1]merge_ways = pow(k, g-1, MOD) * fact[g-1] % MODterm = dp[i - g] * ways % MODterm = term * merge_ways % MODdp[i] = (dp[i] + term) % MODcontribution = dp[c]if contribution == 0:print(0)returnanswer = answer * contribution % MODprint(answer % MOD)if __name__ == "__main__":main()