745 Sum of Squares.sf 872 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 31 January 2021
  4. # https://github.com/trizen
  5. # Sum of Squares
  6. # https://projecteuler.net/problem=745
  7. # Formula:
  8. # S(n) = Sum_{k=1..floor(sqrt(n))} k^2 * R(floor(n/k^2))
  9. # Where R(n) is the number of squarefree numbers <= n:
  10. # R(n) = Sum_{k=1..floor(sqrt(n))} moebius(k) * floor(n/k^2)
  11. # S(10^1) = 24
  12. # S(10^2) = 767
  13. # S(10^3) = 22606
  14. # S(10^4) = 722592
  15. # S(10^5) = 22910120
  16. # S(10^6) = 725086120
  17. # S(10^7) = 22910324448
  18. # S(10^8) = 724475280152
  19. # S(10^9) = 22907428923832
  20. # S(10^10) = 724420596049320
  21. # S(10^11) = 22908061437420776
  22. # S(10^12) = 724418227020757048
  23. # S(10^13) = 22908104289912800016
  24. # Runtime: ~2 minutes (previously: ~3 minutes).
  25. define MOD = 1_000_000_007
  26. func S(n) {
  27. sum(1..n.isqrt, {|k|
  28. mulmod(k.sqr, squarefree_count(idiv(n, k.sqr)), MOD)
  29. })
  30. }
  31. say (S(10**14) % MOD)