320 Factorials divisible by a huge integer.pl 1001 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 18 September 2017
  4. # https://github.com/trizen
  5. # https://projecteuler.net/problem=320
  6. # Runtime: 28.967s
  7. use 5.010;
  8. use strict;
  9. use warnings;
  10. use List::Util qw(uniq);
  11. use experimental qw(signatures);
  12. use ntheory qw(addmod factor vecsum todigits);
  13. sub factorial_power ($n, $p) {
  14. ($n - vecsum(todigits($n, $p))) / ($p - 1);
  15. }
  16. sub p_adic_inverse ($p, $k) {
  17. my $n = $k * ($p - 1);
  18. while (factorial_power($n, $p) < $k) {
  19. $n -= $n % $p;
  20. $n += $p;
  21. }
  22. return $n;
  23. }
  24. sub p_320 {
  25. my $sum = 0;
  26. my $max = 0;
  27. my $pow = 1234567890;
  28. my $from = 10;
  29. my $to = 1e6;
  30. my $mod = 1000000000000000000;
  31. foreach my $i ($from .. $to) {
  32. foreach my $p (uniq(factor($i))) {
  33. my $v = factorial_power($i, $p);
  34. my $t = p_adic_inverse($p, $pow * $v);
  35. $max = $t if $t > $max;
  36. }
  37. $sum = addmod($sum, $max, $mod);
  38. }
  39. return $sum;
  40. }
  41. say p_320();