708 Twos are all you need -- v2.sf 491 B

12345678910111213141516171819202122
  1. #!/usr/bin/ruby
  2. # Twos are all you need
  3. # https://projecteuler.net/problem=708
  4. # Based on formula posted by ohadkel:
  5. #
  6. # S(n) = Sum_{k = 1..n, k is squarefull} 2^(bigomega(k) - 2*omega(k)) * D(n/k)
  7. #
  8. # where D(n) = Sum_{k=1..n} floor(n/k) = A006218(n).
  9. func S(n) {
  10. var total = 0
  11. each_squarefull(1, n, {|k|
  12. total += ((1 << (k.bigomega - 2*k.omega)) * dirichlet_hyperbola(idiv(n,k)))
  13. })
  14. return total
  15. }
  16. say ("S(10^8) = ", S(10**8))
  17. say ("S(10^14) = ", S(10**14))