問題条件を下記のように[1]-[4]とします。
[1]. どの要素もで割ったあまりはでない
[2]. どの相異なるつの要素も、で割ったあまりは等しい
[3]. どの要素も約数の個数は個である
[4]. どの相異なるつの要素も、最大公約数はである
まず[1]の条件で禁止される数は全て排除しましょう。
次に[2]の条件より、で割ったあまりに関してあまりを決め打ちして全探索を行いましょう。
以下その前提ですすめます。
まず[3]の条件より、集合の要素は全て次のいずれかです。
ここで[4]の条件より、集合内のどの要素も同じ素因数を持たないことがわかります。
よってある素数の乗に関しては貪欲に全て集合に加えて良いです。またここで含んだ素数を持つの形で書ける数に関してはこの時点で除外して問題ないです。
ここで以上の素数に関しては全てあるいはと書くことが出来ることを考慮して、場合分けを考えましょう。
・で割った余りがのとき
加えられる数は、のみです。
集合の最大サイズは高々です。
・で割った余りがのとき
加えられる数は、あるいは(ここではの形で書ける素数)のみです
ここでとは互いに素ではないので、集合の最大サイズは高々です。
・で割った余りがのとき
加えられる数は、あるいは(ここではの形で書ける素数)あるいは(ここではの形で書ける素数)のみです
ここではそれぞれ互いに素ではないので、集合の最大サイズは高々です。
・で割った余りがのとき
加えられる数は、(ここではの形で書ける素数)のみです
集合の最大サイズは高々です。
・で割った余りが5のとき
加えられる数は、あるいは(ここではの形で書ける素数、はの形で書ける素数)のみです
の形で書ける数に関しては、かつならば、両方選択することが出来ます。
すなわちの形で書ける素数に関して、素数を頂点としたグラフを考え頂点と頂点に辺を張ると、この問題は辺の張られたグラフから最大マッチングを考える問題になります。
また上記のグラフは部グラフになるため、最大マッチングが簡単に求まります。
よってこの問題が解けました。
計算量は素因数分解の際に 、 二部マッチングの際に必要で、全体で となります。
素因数分解の際にポラード・ロー法などを用いることで、計算量をもう少し良くした解法もあります。