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