485 Maximum number of divisors.pl 653 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 21 February 2017
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=485
  7. # Runtime: 1 min, 33 sec.
  8. use 5.010;
  9. use strict;
  10. use integer;
  11. use ntheory qw(:all);
  12. my $r = 100_000;
  13. my $n = 100_000_000;
  14. my @divisors = map { scalar divisors($_) } 1 .. $r;
  15. my $range_max = vecmax(@divisors);
  16. my $sum = 0;
  17. foreach my $i ($r + 1 .. $n + 1) {
  18. $sum += $range_max;
  19. my $d = divisors($i);
  20. if ($d > $range_max) {
  21. $range_max = $d;
  22. }
  23. push @divisors, $d;
  24. if (shift(@divisors) == $range_max) {
  25. $range_max = vecmax(@divisors);
  26. }
  27. }
  28. say $sum;