結果

問題 No.229 線分上を往復する3つの動点の一致
ユーザー koba-e964koba-e964
提出日時 2016-12-13 01:01:05
言語 C++11
(gcc 13.3.0)
結果
AC  
実行時間 2 ms / 5,000 ms
コード長 1,100 bytes
コンパイル時間 427 ms
コンパイル使用メモリ 57,724 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-11-29 18:23:51
合計ジャッジ時間 1,956 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 43
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <utility>

#define REP(i,s,n) for(int i=(int)(s);i<(int)(n);i++)

using namespace std;
typedef long long int ll;
typedef pair<ll, ll> PL;

ll gcd(ll x, ll y) {
  return y == 0 ? x : gcd(y, x % y);
}

PL add(PL x, PL y) {
  PL w = PL(x.first * y.second + x.second * y.first, x.second * y.second);
  ll g = gcd(w.first, w.second);
  w.first /= g;
  w.second /= g;
  return w;
}

PL inv(PL x) {
  return x.first > 0 ? PL(x.second, x.first) : PL(-x.second, -x.first);
}

PL fr_lcm(PL x, PL y) {
  ll numer = x.first / gcd(x.first, y.first) * y.first;
  ll denom = gcd(x.second, y.second);
  return PL(numer, denom);
}

int main(void){
  ll t1, t2, t3;
  cin >> t1 >> t2 >> t3;
  PL mi = PL(1e16, 1);
  REP(i, 0, 2) {
    REP(j, 0, 2) {
      PL b = PL(1, t1);
      PL d = PL(-1 + 2 * i, t2);
      PL f = PL(-1 + 2 * j, t3);
      PL b_d = inv(add(b, d));
      PL b_f = inv(add(b, f));
      PL res = fr_lcm(b_d, b_f);
      if ((double)mi.first / mi.second > (double)res.first / res.second) {
	mi = res;
      }
    }
  }
  cout << mi.first << "/" << mi.second << endl;
}
0