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