結果
| 問題 |
No.1978 Permutation Repetition
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 16:47:54 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,086 bytes |
| コンパイル時間 | 174 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 68,728 KB |
| 最終ジャッジ日時 | 2025-06-12 16:48:26 |
| 合計ジャッジ時間 | 3,844 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 13 WA * 31 |
ソースコード
import sys
MOD = 10**9 + 7
def main():
sys.setrecursionlimit(1 << 25)
N, M = map(int, sys.stdin.readline().split())
A = list(map(int, sys.stdin.readline().split()))
A = [a-1 for a in A]
visited = [False] * N
cycles = []
for i in range(N):
if not visited[i]:
current = i
cycle = []
while not visited[current]:
visited[current] = True
cycle.append(current)
current = A[current]
cycles.append(len(cycle))
from math import gcd
# 预计算M的所有因数
def get_factors(m):
factors = set()
for i in range(1, int(m**0.5)+1):
if m % i == 0:
factors.add(i)
factors.add(m // i)
return sorted(factors)
factors_M = get_factors(M)
total = 1
for k in cycles:
found = False
for d in factors_M:
g = gcd(d, M)
if k == d // g:
found = True
break
if not found:
print(0)
return
# 计算每个k的可能分解方式数目
# 特别处理k=1的情况
from functools import lru_cache
# 统计所有k=1的数量
count_k1 = 0
for k in cycles:
if k == 1:
count_k1 += 1
# 计算f(count_k1)
@lru_cache(maxsize=None)
def f(n):
if n == 0:
return 1
if n == 1:
return 1
res = f(n-1)
if n >= 2:
res += (n-1) * f(n-2)
res %= MOD
return res % MOD
if count_k1 > 0:
total = (total * f(count_k1)) % MOD
# 处理其他k的情况
for k in cycles:
if k == 1:
continue
# 找到所有因数d,使得k = d / gcd(d, M)
valid = False
for d in factors_M:
g = gcd(d, M)
if k == d // g:
valid = True
break
if not valid:
print(0)
return
print(total % MOD)
if __name__ == '__main__':
main()
gew1fw