結果
| 問題 |
No.917 Make One With GCD
|
| コンテスト | |
| ユーザー |
ngtkana
|
| 提出日時 | 2023-04-20 11:17:15 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 1,054 bytes |
| コンパイル時間 | 14,765 ms |
| コンパイル使用メモリ | 376,448 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-10-15 10:24:07 |
| 合計ジャッジ時間 | 16,248 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
ソースコード
use std::{collections::HashMap, io::stdin};
fn main() {
let stdin = stdin();
let mut stdin = stdin.lines().map(Result::unwrap);
let _n = stdin.next().unwrap().parse::<usize>().unwrap();
let a = stdin
.next()
.unwrap()
.split_whitespace()
.map(|x| x.parse::<u64>().unwrap())
.collect::<Vec<_>>();
let mut dp = HashMap::new();
dp.insert(0, 1_u64);
for &x in &a {
let mut swp = dp.clone();
for (k, v) in dp {
*swp.entry(gcd(k, x)).or_insert(0) += v;
}
dp = swp;
}
let ans = dp.get(&1).copied().unwrap_or(0);
println!("{}", ans);
}
fn gcd(mut m: u64, mut n: u64) -> u64 {
if m == 0 || n == 0 {
return m | n;
}
let shift = (m | n).trailing_zeros();
m >>= m.trailing_zeros();
n >>= n.trailing_zeros();
while m != n {
if m > n {
m -= n;
m >>= m.trailing_zeros();
} else {
n -= m;
n >>= n.trailing_zeros();
}
}
m << shift
}
ngtkana