Le concours typique AtCoder (ATC) est un concours qui pose des questions typiques dans la programmation compétitive. Merci, AtCoder.
AtCoder Typical Contest 002 B - n^p mod m
Ce thème, méthode carrée répétée Ruby Par exemple, lors du calcul de 2 à la puissance 64, si vous multipliez simplement par 2, vous devez multiplier 63 fois, mais en utilisant le résultat du calcul, vous pouvez calculer en multipliant 6 fois, ce qui conduit à un calcul plus rapide.
2^64.rb
n = 2
63.times do
n *= 2
end
puts n # => 18446744073709551616
n = 2
6.times do
n *= n
end
puts n # => 18446744073709551616
La méthode des carrés itératifs est une application de ceci aux puissances impaires et aux diviseurs.
ruby.rb
n, m, p = gets.split.map(&:to_i)
def mpow(n, p, mod)
r = 1
while p > 0
r = r * n % mod if p & 1 == 1
n = n * n % mod
p >>= 1
end
r
end
puts mpow(n, p, m)
Si vous en faites une fonction, vous pouvez l'utiliser pour des concours ultérieurs ~~ copier ~~.
Python
python.py
n, m, p = map(int, input().split())
def mpow(n, p, mod):
r = 1
while p > 0:
if p & 1 == 1:
r = r * n % mod
n = n * n % mod
p >>= 1
return r
print(mpow(n, p, m))
Le suffixe sera après avoir étudié un peu plus. Perl
perl.pl
chomp (my ($n, $m, $p) = split / /, <STDIN>);
sub mpow {
my ($n, $p) = @_;
my $r = 1;
while ($p > 0) {
$r = $r * $n % $m if $p & 1;
$n = $n * $n % $m;
$p >>= 1;
}
$r;
}
print mpow($n, $p), "\n";
Pour * Perl *, cela ne semble pas causer d'erreur dans la portée de $ m. Java
java.java
import java.math.BigInteger;
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
BigInteger n = new BigInteger(sc.next());
BigInteger m = new BigInteger(sc.next());
BigInteger p = new BigInteger(sc.next());
sc.close();
System.out.println(n.modPow(p, m));
}
}
Ruby | Python | Perl | Java | |
---|---|---|---|---|
Longueur du code | 183 Byte | 217 Byte | 227 Byte | 386 Byte |
Temps d'exécution | 7 ms | 17 ms | 3 ms | 106 ms |
Mémoire | 1788 KB | 3060 KB | 640 KB | 24020 KB |
Recommended Posts