288 An enormous factorial.pl 668 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 15 September 2016
  5. # Website: https://github.com/trizen
  6. # https://projecteuler.net/problem=288
  7. # Runtime: 4.453s
  8. use 5.010;
  9. use strict;
  10. use ntheory qw(powmod);
  11. my $p = 61;
  12. my $q = 10**7;
  13. my $k = 10;
  14. my $mod = 61**$k;
  15. my $s = 290797;
  16. sub fpower {
  17. my ($n) = @_;
  18. return 0 if $n == 0;
  19. powmod($p, $n - 1, $mod) + fpower($n - 1);
  20. }
  21. my $sum = 0;
  22. my $pow = 0;
  23. foreach my $n (0 .. $q) {
  24. my $t = $s % $p;
  25. $s = powmod($s, 2, 50515093);
  26. if ($n <= $k) {
  27. $pow = fpower($n);
  28. }
  29. if ($t != 0) {
  30. $sum += $pow * $t;
  31. $sum %= $mod;
  32. }
  33. }
  34. say $sum;