565 Divisibility of sum of divisors.pl 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 04 July 2018
  4. # https://github.com/trizen
  5. # https://projecteuler.net/problem=565
  6. # Runtime: ~4 minutes
  7. use 5.010;
  8. use strict;
  9. use warnings;
  10. use ntheory qw(is_prime divisor_sum logint sqrtint forprimes);
  11. sub S {
  12. my ($n, $k) = @_;
  13. my %seen;
  14. my $sum = 0;
  15. my $process_term = sub {
  16. my ($t) = @_;
  17. for (my $s = $t ; $s <= $n ; $s += $t) {
  18. next if ($s % $t**2 == 0);
  19. if (divisor_sum($s / $t) % $k == 0) {
  20. next if $seen{$s}++;
  21. }
  22. if (divisor_sum($s) % $k == 0) {
  23. $sum += $s;
  24. }
  25. }
  26. };
  27. forprimes {
  28. my $p = $_;
  29. foreach my $e (3 .. 1 + logint($n, $p)) {
  30. if (($p**$e - 1) % $k == 0) {
  31. $process_term->($p**($e - 1));
  32. }
  33. }
  34. } sqrtint($n);
  35. for (my $t = $k ; $t <= $n ; $t += $k) {
  36. if (is_prime($t - 1)) {
  37. $process_term->($t - 1);
  38. }
  39. }
  40. return $sum;
  41. }
  42. say S(1e6, 2017);
  43. say S(1e9, 2017);
  44. say S(1e11, 2017);