結果
問題 | No.1287 えぬけー |
ユーザー | ikd |
提出日時 | 2020-11-14 11:13:54 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 223 ms / 2,000 ms |
コード長 | 1,671 bytes |
コンパイル時間 | 14,376 ms |
コンパイル使用メモリ | 394,720 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-22 22:45:27 |
合計ジャッジ時間 | 14,638 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 5 |
ソースコード
// ax + by = gcd(a, b) = g を満たす (x, y, g) を返す fn ext_gcd(a: i64, b: i64) -> (i64, i64, i64) { if b == 0 { // ax + 0y = a // -> x = 1 (1, 0, a) } else { // a = bq + r // -> b * (qx + y) + rx = g let (q, r) = (a / b, a % b); let (s, t, g) = ext_gcd(b, r); (t, s - q * t, g) } } fn mpow(a: i64, x: i64, m: i64) -> i64 { if x == 0 { 1 } else if x % 2 == 0 { mpow(a * a % m, x / 2, m) } else { a * mpow(a, x - 1, m) % m } } fn main() { let stdin = std::io::stdin(); let mut rd = ProconReader::new(stdin.lock()); let p = 1_000_000_000 + 7; let t: usize = rd.get(); for _ in 0..t { let x: i64 = rd.get(); let k: i64 = rd.get(); let (a, mut b, g) = ext_gcd(p - 1, k); assert_eq!(a * (p - 1) + b * k, g); b += p - 1; b %= p - 1; println!("{}", mpow(x, b, p)); } } pub struct ProconReader<R: std::io::Read> { reader: R, } impl<R: std::io::Read> ProconReader<R> { pub fn new(reader: R) -> Self { Self { reader } } pub fn get<T: std::str::FromStr>(&mut self) -> T { use std::io::Read; let buf = self .reader .by_ref() .bytes() .map(|b| b.unwrap()) .skip_while(|&byte| byte == b' ' || byte == b'\n' || byte == b'\r') .take_while(|&byte| byte != b' ' && byte != b'\n' && byte != b'\r') .collect::<Vec<_>>(); std::str::from_utf8(&buf) .unwrap() .parse() .ok() .expect("Parse Error.") } }