160 Factorial trailing digits.pl 901 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 17 August 2016
  4. # License: GPLv3
  5. # Website: https://github.com/trizen
  6. # https://projecteuler.net/problem=160
  7. use 5.010;
  8. use strict;
  9. use warnings;
  10. use integer;
  11. use ntheory qw(forprimes powmod);
  12. sub power {
  13. my ($n, $p) = @_;
  14. my $s = 0;
  15. while ($n >= $p) {
  16. $s += int($n /= $p);
  17. }
  18. $s;
  19. }
  20. #my $k = 1_000_000_000_000; # 2560000 yields the same answer
  21. my $k = 2560000;
  22. my $t = power($k, 5);
  23. sub f {
  24. my ($n) = @_;
  25. my $p = 0;
  26. my $prod = 1;
  27. forprimes {
  28. if ($p == 1) {
  29. $prod *= $_ % 10**5;
  30. $prod %= 10**5;
  31. }
  32. else {
  33. $p = power($n, $_);
  34. if ($_ != 5) {
  35. $prod *= powmod($_ % 10**5, ($_ == 2 ? $p - $t : $p), 10**5);
  36. $prod %= 10**5;
  37. }
  38. }
  39. } $k;
  40. $prod;
  41. }
  42. say f($k);