304 Primonacci.pl 796 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 20 August 2016
  4. # License: GPLv3
  5. # Website: https://github.com/trizen
  6. # https://projecteuler.net/problem=304
  7. # Runtime: 31.959s
  8. use 5.010;
  9. use strict;
  10. use warnings;
  11. use ntheory qw(next_prime);
  12. use Memoize qw(memoize);
  13. use Math::GMP qw(:constant);
  14. memoize('a');
  15. memoize('f');
  16. my $mod = 1234567891011;
  17. sub f {
  18. my ($n) = @_;
  19. return 1 if $n == 0;
  20. return 1 if $n == 1;
  21. my $k = int($n / 2);
  22. ($n % 2 == 0)
  23. ? (f($k) * f($k) + f($k - 1) * f($k - 1)) % $mod
  24. : (f($k) * f($k + 1) + f($k - 1) * f($k)) % $mod;
  25. }
  26. sub a {
  27. my ($n) = @_;
  28. $n == 1
  29. ? next_prime(10**14)
  30. : next_prime(a($n - 1));
  31. }
  32. my $sum = 0;
  33. for my $i (1 .. 100_000) {
  34. $sum += f(a($i) - 1);
  35. $sum %= $mod;
  36. }
  37. say $sum;