この問題では約数列挙、再帰関数を問います。

問題の の約数 (負整数を含む) であることは明らかです。問題の条件を満たすような は再帰関数を用いて実装できますが、負の約数を含めて調べてしまうとあるケース※では時間制限に間に合わなくなってしまいます。なのでここでは時間に間に合うように工夫しなければなりません。

実は、 の正の約数だけ調べてから、候補となる を再帰的に探索することが適切です※
、または が素数の場合においては条件文で判定することに注意※してください。以下の解答例(C++,Python)も参考にしてみてください。


例えば などのケースが該当します。この理由は の正の約数の個数がより多いためです(このような数は高度合成数と呼ばれます。ここでは説明は省略します)


次のそれぞれの場合について、以下のように考えることができます。

  • のとき: の正負は考えなくても良い (最終的な答えで、辻褄があうように を適宜かけ合わせればよいため)
  • のとき: 制約から も負であるため、 の正の約数にすべて を掛け合わせればよい (確かに とはならないが、候補となる約数はすべて負となるため)
  • のとき: 制約から も正であるため、最終的な答えには何も影響しない

したがって の正の約数を候補に入れながら を探索することで、負の約数を考慮せずに実装できます。

また なら負の約数を偶数個含んでいる( 個でもよい)のと、 なら奇数個含んでいることが必要であることに注意してください。


実装方法によっては、 を候補にすると関数内で無限ループを起こす可能性があります。なのでその時に限り、以下の条件のいずれか一つをみたすことができるか判定すればよいです。

  • であるか?
  • かつ であるか?