Problem 48 "Self powers"
The series, 11 + 22 + 33 + ... + 1010 = 10405071317.
Find the last ten digits of the series, 11 + 22 + 33 + ... + 10001000.
問 48 「自身のべき乗」
11 + 22 + 33 + ... + 1010 = 10405071317.
11 + 22 + 33 + ... + 10001000 の最後の10桁を求めよ.
fn conservative_mod_pow(a: u64, exp: u64, m: u64) -> u64 { let mut result = 1; for _ in 0..exp { result *= a; result %= m; } result } fn main() { let m = 10_000_000_000; let mut sum = 0u64; for n in 1..=1000 { sum += conservative_mod_pow(n, n, m); sum %= m; } println!("{}", sum); assert_eq!(sum, 9110846700); }
fn mod_pow(a: u64, exp: u64, m: u64) -> u64 { let (mut a, mut exp, m) = (a as u128, exp as u128, m as u128); if m == 1 { return 0; } if exp == 0 { return 1; } let mut result = 1; a %= m; loop { if exp % 2 == 1 { result *= a; result %= m; } exp >>= 1; if exp == 0 { break; } a *= a; a %= m; } result as u64 } fn main() { let m = 10_000_000_000u64; let mut sum = 0u64; for n in 1..=1000 { sum += mod_pow(n, n, m); sum %= m; } println!("{}", sum); assert_eq!(sum, 9110846700); }