けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder AGC 046 A - Takahashikun, The Strider (灰色, 200 点)

面白かった。久しぶりの最大公約数ゲー。

問題概要

平面上に高橋君がおり、真北を向いて立っています。 高橋君が以下の行動を  K 回繰り返したときに元の位置に戻ってくるような最小の正の整数  K を求めてください。

  • 今向いている方向に 1 メートル進む。その後、向いている方向を反時計回りに X 度だけ回転させる。

制約

  •  1 \le X \le 179

考えたこと

一般には高橋君はグルッと円周をなぞるように動いて、何周かして、スタート地点に戻るようなムーブをします。具体的には

 XK が 360 の倍数

となるような最小の正の整数  K を求めればよい、ということになります。

もし  X が 360 の約数ならば、 \frac{360}{X} が答えとなります。もし  X と 360 が互いに素ならば、 K は 360 の倍数でなければならず、 K = 360 となります。

一般論として、 X と 360 の最大公約数を  g とします。そして

  •  X = ga
  •  360 = gb

とします。このとき、 a, b は互いに素となります。そして  aK b の倍数となるような  K を求めればよいことになります。 a, b は互いに素なので、 K b の倍数となります。よって答えは  K = b です。

具体的には

 \frac{360}{{\rm GCD}(X, 360)}

となります。

コード

#include <bits/stdc++.h>
using namespace std;

long long GCD(long long x, long long y) {
  if (y == 0) return x;
  else return GCD(y, x % y);
}

int main() {
  long long X;
  cin >> X;
  cout << 360 / GCD(X, 360) << endl;
}