毛のはえたようなもの

インターネット的なものをつらつらとかきつらねる。

Problem 12

三角数の数列は自然数の和で表わされ、7番目の三角数は 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 である。
7番目の三角数である28は5つ以上の約数をもつ。
では、501 個以上の約数をもつ最初の三角数はいくらか。

Problem 12 - PukiWiki

素数の流用がおおいっす。

def prime_number?(num,pl)
  return false if num < 2
  return true if num==2 || num==3|| num==5|| num==7|| num==11|| num==13|| num==17|| num==19|| num==23|| num==29|| num==31|| num==37
  return false if num %2==0 ||num%3==0 ||num%5==0 ||num % 7==0||num % 11==0||num % 13==0||num % 17==0||num % 19==0||num % 23==0||num % 29==0||num % 31==0||num % 37==0

  r = Math.sqrt(num) 
  pl.each{|j|
    break if  j > r
    return false if num %j == 0
  }
  return  true
end


def over500?(num)
  pl=[]
  p_nl =[]
  (2..num).each{|i|
    if num % i == 0 && prime_number?(i,pl) then
      pl.push(i)
      
      k = true
      counter = 0
      while k
        if  num % i == 0 then 
          num = (num/i).to_i and counter +=1 
        else
          p_nl.push(counter) and k = false
        end
      end
      break if i > num
    end
  }

  ans =1
  p_nl.each{|i| ans = ans * (i+1)}
  return (ans  > 500 ? true : false)
end


limit = 501
number = Math.sqrt(2 * limit).to_i
flag = false

while !flag
  target = (number*(number+1) / 2).to_i
  number +=1 and next if target < limit
  over500?(target) ? flag = true :  number +=1
end

p (number*(number+1) / 2).to_i

答え:76576500