結果
問題 | No.1978 Permutation Repetition |
ユーザー |
|
提出日時 | 2022-06-10 22:58:08 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,360 ms / 2,000 ms |
コード長 | 2,613 bytes |
コンパイル時間 | 277 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 81,968 KB |
最終ジャッジ日時 | 2024-09-21 06:44:55 |
合計ジャッジ時間 | 6,335 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 44 |
ソースコード
import sys,random,bisectfrom collections import deque,defaultdictfrom heapq import heapify,heappop,heappushfrom itertools import permutationsfrom math import log,gcdinput = lambda :sys.stdin.readline().rstrip()mi = lambda :map(int,input().split())li = lambda :list(mi())def cmb(n, r, mod):if ( r<0 or r>n ):return 0return (g1[n] * g2[r] % mod) * g2[n-r] % modmod = 10**9 + 7N = 2*10**5g1 = [1]*(N+1)g2 = [1]*(N+1)inverse = [1]*(N+1)for i in range( 2, N + 1 ):g1[i]=( ( g1[i-1] * i ) % mod )inverse[i]=( ( -inverse[mod % i] * (mod//i) ) % mod )g2[i]=( (g2[i-1] * inverse[i]) % mod )inverse[0]=0def mul(f,g):res = [0 for i in range(len(f)+len(g)-1)]for i in range(len(f)):for j in range(len(g)):res[i+j] += f[i] * g[j] % modres[i+j] %= modreturn resdef solve(N,M,A):if min(A)==1:A = [a-1 for a in A]visit = [False] * NLs = [0] * (N+1)for i in range(N):if visit[i]:continuevisit[i] = Truek = 1pos = iwhile not visit[A[pos]]:pos = A[pos]visit[pos] = Truek += 1Ls[k] += 1res = 1#print(Ls)for L in range(1,N+1):dp = [g1[Ls[L]]]for a in range(1,Ls[L]+1):if gcd(M,a*L)==a:tmp = [0] * (N+1)tmp[0] = 1p,q = 1,1c = pow(L,a-1,mod)for k in range(1,N+1):p = (p * c) % modq = (q * inverse[a]) % modif a*k <= N:tmp[a*k] = (p*q % mod) * g2[k] % moddp = mul(dp,tmp)[:Ls[L]+1]#print(L,dp)if Ls[L] < len(dp):res *= dp[Ls[L]]else:res = 0res %= modreturn resdef brute(N,M,A):if min(A)==1:A = [a-1 for a in A]per = permutations([i for i in range(N)])res = 0for p in per:for i in range(N):pos = ifor _ in range(M):pos = p[pos]#stack.append(pos)if pos!=A[i]:breakelse:#print(p)res += 1return reswhile False:N = 8M = random.randint(1,10)A = [i for i in range(N)]random.shuffle(A)if solve(N,M,A)!=brute(N,M,A):print(N,M)print(A)print(solve(N,M,A),brute(N,M,A))exit()N,M = mi()A = li()print(solve(N,M,A))