P의 사이클 분해를 생각하자. Ai2=P이면 AiP=PAi이므로, 모든 Ai는 P와 교환한다. 따라서 Ai는 P의 사이클을 같은 길이의 사이클로만 보낸다. 그러므로 사이클 길이별로 독립적으로 세고 곱하면 된다.
길이 d인 P-사이클의 개수를 m이라 하자. K개의 순열 Ai가 유도하는 사이클들 사이의 작용은 의 작용으로 볼 수 있다. 하나의 연결 성분에 포함되는 -사이클의 개수는 항상 꼴이다.
크기 2r인 성분 하나를 고정된 2r개의 사이클 위에 만드는 경우의 수를 cd,r라 하자. 그러면 다음 식이 성립한다.
d가 홀수이면
cd,r=[rK
d가 짝수이면 r=0은 불가능하고, r≥1에 대해
cd,r=[r
여기서
[rn]2=
는 이진 Gaussian binomial coefficient이다. 이 문제에서는 r≤log2N이므로 K가 매우 커도 빠르게 계산할 수 있다.
이제 F[n]을 길이 d인 사이클 n개를 처리하는 경우의 수라고 하자. 첫 번째 사이클이 속한 성분의 크기가 2r이면 나머지 n개 중 개를 고르면 된다. 따라서
F[0]=1,
F[n]=2r≤n∑
모든 d에 대해 이 DP 값을 곱하면 정답이다. 전체 시간복잡도는 O(NlogN)이다.