三角数がもつ約数の数がN以上になる最初の数を求めるという問題です。(与えられている問題ではN=500)

 

n番目の三角数Tnは、n(n+1)/2で与えられます。

nとn+1は同じ因数を持たないので互いに素、しかもどちらかが偶数、どちらかが奇数です。

つまり、

nが偶数の時、n/2の約数の数と、n+1の約数の数を掛ければ、Tnの約数の数が求まります。

nが奇数の時、nの約数の数と、(n+1)/2の約数の数を掛ければ、Tnの約数の数が求まります。

 

ということで、nに対する約数の数を求めて辞書にすることを考えてみます。

但し、nが偶数の場合は、n/2の約数の数とします。
初期値として、dic_n={1:1, 2:1}を与えておきましょう。(2は偶数なので、1の約数の数を求めているということになります。)

もし、nが偶数なら、2^kと、割った商が素になり、商に対する約数の個数は辞書に記載されています。辞書を参照してその値にkを掛け、その値を辞書に追加します。

もし、奇数なら、試し割り法で、順に調べていきますが、最後まで調べる必要はなく、途中でm^kで割りきれることがわかったら、そこで止めて大丈夫です。商に対する個数が辞書にあるはずなので、辞書から参照し、その値に(k+1)を掛けて、辞書に追加します。

素数の場合は、2になることが明らかなので、あらかじめ素数表を作っておいてという方法もありますが、大きい数字でなければ、それほど変わらないかもしれません。

 

nに対する約数の個数が求まった段階で、dic_n[n-1]*dic_n[n]がTn-1の約数の数となります。

この数がNを超えたところで答えが求まったことになります。

 

N=500だと、結構どんなやり方をしても求まりそうですが、N=1000を超えたあたりから、徐々にしんどくなってきます。

1000以上になるのが、T41040

2000以上になるのが、T313599

3000以上になるのが、T453375

4000以上になるのが、T1890944
5000以上になるのが、T2203200

6000以上になるのが、T2756159

7000以上になるのが、T7289919

8000以上になるのが、T10497024

9000以上になるのが、T11851839

10000以上になるのが、T14753024

ここまで来ると計算時間が1分近くになってきました。

ちなみにT14756024の値は、108,825,865,948,800825,865,948,800という結果です。