pub fn modpow(mut a: usize, mut n: usize, m: usize) -> usize {
let mut ans = 1;
while n > 0 {
if n & 1 == 1 {
ans = ans * a % m;
}
a = a * a % m;
n >>= 1;
}
ans
}
#[cfg(test)]
mod test_modpow {
use crate::math::modpow::modpow;
#[test]
fn it_works() {
assert_eq!(modpow(2, 10, 1_000_000_007), 1024);
assert_eq!(modpow(2, 3, 1_000_000_007), 8);
assert_eq!(modpow(5, 8, 1_000_000_007), 390625);
assert_eq!(modpow(2, 2, 3), 1);
assert_eq!(modpow(2, 3, 3), 2);
}
}