source code for "files/pe/pe_048.pl"
return to portfolio
- #!/usr/bin/perl
- use strict;
- use warnings;
- use bigint;
- # raises $n to $p while modding by $mod between each step
- # also... it does it the smart way.. more or less
- sub pow_mod {
- my ($n, $p, $mod) = @_;
- my ($result) = 1;
- my ($temp) = $n;
- my (@seq);
- my ($k) = 0;
- while ($p) {
- push @seq, $p%2;
- $p/=2;
- }
- for my $s (@seq) {
- $temp = $n;
- for (1..$k) {
- $temp *= $temp % $mod;
- }
- $result *= $temp % $mod if $s == 1;
- $temp = $n % $mod;
- $k++;
- }
- return $result % $mod;
- }
- # init
- my ($sum) = 0;
- # work
- for (1..1000) {
- $sum += pow_mod($_, $_, 10**10);
- $sum = $sum % 10**10;
- }
- print $sum;