622 Riffle Shuffles.pl 700 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 13 March 2018
  4. # https://github.com/trizen
  5. # https://projecteuler.net/problem=622
  6. # Runtime: 0.046s
  7. use 5.020;
  8. use strict;
  9. use warnings;
  10. use experimental qw(signatures);
  11. use ntheory qw(znorder lcm vecprod forcomb);
  12. sub rshuffle_cycle_len ($n) {
  13. lcm(2, znorder(2, $n - 1));
  14. }
  15. # The prime factorization of 2^60-1
  16. my @primes = (3, 3, 5, 5, 7, 11, 13, 31, 41, 61, 151, 331, 1321);
  17. my %seen;
  18. my $sum = 0;
  19. foreach my $k (1 .. @primes) {
  20. forcomb {
  21. my $prod = vecprod(@primes[@_]);
  22. if (rshuffle_cycle_len($prod + 1) == 60) {
  23. $sum += $prod + 1 if !$seen{$prod}++;
  24. }
  25. } scalar(@primes), $k;
  26. }
  27. say $sum;