たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

【C#】ユークリッド互除法を実装してみた AtCoder Beginner Contest 109-C

今回はユークリッド互除法の問題を解いてみました。

atcoder.jp

結果

f:id:c_taquna:20190826200750p:plain

コード

github.com

ユークリッド互除法

ユークリッド互除法は、2つの自然数の最大公約数を求めることができます。3つ以上の自然数の場合は、”AとBの最大公約数とCの最大公約数を計算する”ことで求めることができます。

ja.wikipedia.org

ABC109-C問題の実装

今回は数直線状にある都市を全部回る必要があります。条件は下記。

スタート地点は X 現在の座標からDだけ移動することができる *全部の都市をまわる必要がある

このDを求めるのが今回の問題です。つまり、今の座標から全部の街をまわれる最大のDを計算します。

考え方

スタート地点のXから目標座標までの距離を計算します。Dだけ移動できるので、計算した距離をちょうど0にするには、距離の値がDの倍数である必要があります。つまり、このDは各地点までの距離の最大公約数を計算することで求められます。

これで距離を求めます。

for (long i = 0; i < N; i++)
{
    dist[i] = Math.Abs(X - long.Parse(input[i]));
}

これで、最大公約数を求めます。

static long CalGcd(long x, long y)
{
    if (y == 0) { return x; }
    return CalGcd(y, x % y);
}

ちょっとハマったポイントとしては、このように計算結果をgcdに入れないと、次のループ時にgcdが最初の2値の最大公約数とならず(初期値のまま)、NGになります。

for (long i = 0; i < N; i++)
{
    gcd = CalGcd(gcd, dist[i]);
}

まとめ

わかりやすかったので、練習問題に良い