疲。
第16回 アルゴリズム実技検定(過去問)
- J - 除夜の鐘
https://atcoder.jp/contests/past16-open/tasks/past202309_j
- 提出: https://atcoder.jp/contests/past16-open/submissions/50954265
- 解説 AC
- A の要素間の差を求めて、それらの gcd を求めて、その約数列挙まではわかった
- そこからの絞り込みをうまく書けなかった
- A_1 と A_k の間に N-1 回以上鐘がならないといけない
use proconio::input; fn divisors(n: usize) -> Vec<usize> { let mut d = vec![]; for i in 1.. { if i * i > n { break; } if n % i == 0 { d.push(i); if i != n / i { d.push(n / i); } } } d.sort(); d } fn gcd(n: usize, m: usize) -> usize { if m == 0 { n } else { gcd(m, n % m) } } fn main() { input! { n: usize, k: usize, a: [usize; k], }; let mut b = vec![]; let mut prev = a[0]; for a_i in a.iter().copied().skip(1) { b.push(a_i - prev); prev = a_i; } let mut g = gcd(b[0], if b.len() == 1 { b[0] } else { b[1] }); for b_i in b { g = gcd(g, b_i); } let mut ans = vec![]; for d in divisors(g) { if (n - 1) * d >= a[k - 1] - a[0] { ans.push(d); } } println!("{}", ans.len()); for a in ans { println!("{}", a); } }
今日のコミット。
- bbna 3 commits
- rust-atcoder 1 commit