置換の累乗根を考える問題。ひとまず置換を巡回置換に分解すると、巡回置換の長さと個数だけに意味があることがわかる。与えられた置換が長さlの巡回置換C(l)個から構成されるとして、累乗根を探す。
一般に長さLの巡回置換をk乗すると長さL/gcd(L,k)の巡回置換gcd(L,k)個に分解される。逆に長さlの巡回置換がいくつかある時、L=gcd(L,k)lを満たすようなLがあれば、長さlの巡回置換をgcd(L,k)個合わせた置換のk乗根として長さLの巡回置換を構成できる。
そこで、長さlの巡回置換に対して可能な長さLの集合をS(l,k)とする:
S(l,k)={L:L=lgcd(L,k),L≤f(l)l}
長さL∈S(l,k)を採用するとき、長さlの巡回置換をgcd(L,k)個消費して(k乗根となる長さLの)巡回置換が作れることになる。したがって、この問題はS(l,k)内の長さを重複を許して自由に使ってC(l)個をちょうど消費する問題になる。(重複あり部分和問題) この問題をすべてのlについて解けばよい。解けないlがあれば解なしとなる。
計算量について。S(l,k)を求めるのは1,2,...f(l)lをすべて試せばよくて、f(l)lの総和はちょうどNに等しいのでこの部分はO(N)である。Lはkの約数にlを掛けたものだから、S(l,k)のサイズはkの約数の総数d(k)を超えない。したがって、各部分和問題のサイズはC(l)d(k)で総和はNd(k)。全体の計算量もO(Nd(k))になる。