221 Alexandrian Integers.pl 735 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 18 August 2016
  4. # License: GPLv3
  5. # Website: https://github.com/trizen
  6. # https://projecteuler.net/problem=221
  7. # Runtime: 3.966s
  8. use 5.010;
  9. use strict;
  10. use ntheory qw(divisors);
  11. my %nums;
  12. my $count = 0;
  13. my $nth = 150000;
  14. my $prev = 6;
  15. OUT: foreach my $n (1 .. $nth) {
  16. foreach my $d (divisors($n * $n + 1)) {
  17. my $q = $n + $d;
  18. my $r = ($n + ($n * $n + 1) / $d);
  19. last if $q > $r;
  20. my $A = $n * $q * $r;
  21. --$count if ($A < $prev);
  22. if (not exists $nums{$A}) {
  23. undef $nums{$A};
  24. $prev = $A;
  25. last OUT if (++$count == $nth);
  26. }
  27. }
  28. }
  29. say +(sort { $a <=> $b } keys %nums)[$nth - 1];