135 Same differences.pl 929 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 12 August 2017
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=135
  7. # Runtime: 3.973s
  8. use 5.010;
  9. use strict;
  10. use warnings;
  11. use ntheory qw(divisors);
  12. sub has_ten_solutions {
  13. my ($n) = @_;
  14. my @divisors = divisors($n);
  15. my $count = 0;
  16. foreach my $divisor (@divisors) {
  17. last if $divisor > sqrt($n);
  18. my $p = $divisor;
  19. my $q = $n / $divisor;
  20. my $k = $q + $p;
  21. ($k % 4 == 0) ? ($k >>= 2) : next;
  22. my $x1 = 3*$k - (($q - $p) >> 1);
  23. my $x2 = 3*$k + (($q - $p) >> 1);
  24. if (($x1 - 2*$k) > 0) {
  25. ++$count;
  26. }
  27. if ($x1 != $x2) {
  28. return 0 if ++$count > 10;
  29. }
  30. }
  31. return ($count == 10);
  32. }
  33. my $count = 0;
  34. foreach my $n (1 .. 1e6 - 1) {
  35. ($n % 4 != 1)
  36. && has_ten_solutions($n)
  37. && $count++;
  38. }
  39. say $count;