まずは与えられた数列の美しさを求める方法を考える。数列(ai)にi桁目が1の数がd(i)個含まれているとき、d(i)個から奇数個選べば残りの数をどう選んでもxorのi桁目が1になる。つまり、i桁目だけに限ってxorの総和を取ると、d(i)>0なら2iが
==2N−d(i)((1d(i))+(3d(i))+...)2N−d(i)2d(i)−12N−1
個足されることになる。すなわち、i桁目が立っている数が(ai)の中に1つでもあれば、i桁目の総和は2N−12iであり、ひとつもなければ0である。したがって、全体の総和はbitwise orを使って
2N−1i=1⋁Nai
と表すことができる。これが(ai)の美しさである。
次にF(N,B):= 長さNで美しさBの数列の数、を求める方法を考える。上の式を見ると、Bが与えられたときにB/2N−1の立っているビットを考えればよいことがわかる。つまり、B/2N−1のi桁目が1なら、N個の数のうちの少なくとも1つの数のi桁目が1であればよく、i桁目に限定したN個の数の選び方は2N−1通りとなる。いっぽう、B/2N−1のi桁目が0なら、N個の数の対応するi桁目はすべて0でなければならないので、選び方は1通りである。したがって、整数xの立っているビットの総数をc(x)で表すとき、
F(N,B)={(2N−1)c(B/2N−1)0(Bが2N−1で割り切れる)(それ以外)
と書ける。
さて、解くべき問題はF(N,B)≡XmodMを満たす最小のBを求めるというものだった。上の式を見ると、(2N−1)k≡XmodMを満たす最小のk≥0が求まれば、k個の1を並べてN−1回左シフトしたものが求める最小のBということになる。これで離散対数問題に帰着できた。
ただし、上の式からわかるように、N≥2の時は美しさ1の数列がないので、X=0に対しては常に1が答えということになる。(もちろんM=0なら0)。