結果
問題 | No.1287 えぬけー |
ユーザー | ikd |
提出日時 | 2020-11-14 11:06:57 |
言語 | Rust (1.77.0 + proconio) |
結果 |
AC
|
実行時間 | 221 ms / 2,000 ms |
コード長 | 1,736 bytes |
コンパイル時間 | 13,707 ms |
コンパイル使用メモリ | 403,928 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-22 22:44:51 |
合計ジャッジ時間 | 14,555 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 1 ms
5,248 KB |
testcase_02 | AC | 1 ms
5,248 KB |
testcase_03 | AC | 1 ms
5,248 KB |
testcase_04 | AC | 1 ms
5,248 KB |
testcase_05 | AC | 210 ms
5,248 KB |
testcase_06 | AC | 213 ms
5,376 KB |
testcase_07 | AC | 221 ms
5,376 KB |
testcase_08 | AC | 206 ms
5,376 KB |
ソースコード
// 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); if b < 0 || b >= p - 1 { 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.") } }