609 pi sequences.pl 906 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 14 September 2017
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=609
  7. # Runtime: ~4 minutes
  8. use 5.010;
  9. use strict;
  10. use warnings;
  11. use ntheory qw(primes);
  12. sub p_609 {
  13. my ($n, $mod) = @_;
  14. my %primes;
  15. @primes{@{primes($n)}} = ();
  16. my @pc;
  17. my $pc = 0;
  18. my %table;
  19. foreach my $i (1 .. $n) {
  20. $pc++ if exists($primes{$i});
  21. $pc[$i] = $pc;
  22. my $u = $pc;
  23. my $c = exists($primes{$i}) ? 0 : 1;
  24. while ($u >= 1) {
  25. ++$c if !exists($primes{$u});
  26. ++$table{$c};
  27. $u = $pc[$u];
  28. }
  29. }
  30. my $prod = 1;
  31. foreach my $key (keys %table) {
  32. my $val = $table{$key};
  33. if ($val > 0) {
  34. $prod *= $val % $mod;
  35. $prod %= $mod;
  36. }
  37. }
  38. return $prod;
  39. }
  40. say p_609(1e8, 1000000007);