407 Idempotents.pl 666 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 25 August 2016
  4. # License: GPLv3
  5. # Website: https://github.com/trizen
  6. # https://projecteuler.net/problem=407
  7. # Runtime: 1 min 16.11s
  8. use 5.010;
  9. use strict;
  10. use integer;
  11. use ntheory qw(
  12. invmod
  13. fordivisors
  14. prime_count
  15. is_prime_power
  16. forcomposites
  17. );
  18. my $limit = 10**7;
  19. my $sum = prime_count($limit);
  20. forcomposites {
  21. if (is_prime_power($_)) {
  22. ++$sum;
  23. }
  24. else {
  25. my $c = $_;
  26. my $max = 0;
  27. fordivisors {
  28. my $g = invmod($_, $c / $_) * $_;
  29. $g > $max && ($max = $g);
  30. } $c;
  31. $sum += $max;
  32. }
  33. } $limit;
  34. say $sum;