618 Numbers with a given prime factor sum.pl 855 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 15 January 2018
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=618
  7. # See also:
  8. # https://oeis.org/A002098
  9. # Runtime: ~3 minutes.
  10. use 5.020;
  11. use experimental qw(signatures);
  12. use ntheory qw(primes mulmod addmod lucasu);
  13. my $sum = 0;
  14. my $mod = 10**9;
  15. foreach my $k (2 .. 24) {
  16. my $n = lucasu(1, -1, $k);
  17. my @primes = @{primes($n)};
  18. my @cache;
  19. my $S = sub ($n, $k) {
  20. return 1 if ($n == 0);
  21. return 0 if ($k == 0);
  22. $cache[$n][$k] //=
  23. addmod(__SUB__->($n, $k - 1), ($n - $primes[$k - 1]) < 0 ? 0 :
  24. mulmod($primes[$k - 1], __SUB__->($n - $primes[$k - 1], $k), $mod), $mod);
  25. }->($n, scalar @primes);
  26. say "S(fib($k)) = $S";
  27. $sum = addmod($sum, $S, $mod);
  28. }
  29. say "Last nine digits: $sum";