500 Problem 500.pl 741 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 21 September 2016
  4. # License: GPLv3
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=500
  7. # Runtime: 0.168s
  8. use 5.010;
  9. use strict;
  10. use ntheory qw(forprimes primes logint);
  11. sub first_n_factors {
  12. my ($num) = @_;
  13. my $limit = logint($num, 2) * $num; # overshoots a little bit
  14. my @factors = @{primes($limit)};
  15. forprimes {
  16. my $t = $_;
  17. while (($t **= 2) <= $limit) {
  18. push @factors, $t;
  19. }
  20. } $num;
  21. @factors = sort { $a <=> $b } @factors;
  22. $#factors = $num - 1;
  23. @factors;
  24. }
  25. my $p = 1;
  26. my $mod = 500500507;
  27. my $pow = 500500;
  28. foreach my $f (first_n_factors($pow)) {
  29. $p *= $f;
  30. $p %= $mod;
  31. }
  32. say $p;