結果
| 問題 |
No.750 Frac #1
|
| コンテスト | |
| ユーザー |
gemy
|
| 提出日時 | 2023-11-22 08:05:44 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 1,000 ms |
| コード長 | 2,773 bytes |
| コンパイル時間 | 2,132 ms |
| コンパイル使用メモリ | 199,988 KB |
| 最終ジャッジ日時 | 2025-02-17 22:51:24 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
// 有理数 Fraction (符号は分子に押し付ける)
template <class T> class Fraction {
public:
// 分子と分母 (a over b)
T a, b;
// 0/1 で初期化
Fraction() : a(0), b(1) {}
// a/b で初期化
Fraction(T a, T b = 1) {
T g = gcd(a, b);
this->a = (b > 0 ? a : -a) / g;
this->b = abs(b) / g;
}
// 整数か判定
bool isint() { return b == 1; }
// 絶対値
friend Fraction abs(const Fraction& r) { return Fraction(abs(r.a), r.b); }
// 等しい
friend bool operator==(const Fraction& r1, const Fraction& r2) {
return r1.a * r2.b == r1.b * r2.a;
}
// より小さい
friend bool operator<(const Fraction& r1, const Fraction& r2) {
return r1.a * r2.b < r1.b * r2.a;
}
// より小さいか等しい
friend bool operator<=(const Fraction& r1, const Fraction& r2) {
return r1.a * r2.b <= r1.b * r2.a;
}
// より大きい
friend bool operator>(const Fraction& r1, const Fraction& r2) {
return r1.a * r2.b > r1.b * r2.a;
}
// より大きいか等しい
friend bool operator>=(const Fraction& r1, const Fraction& r2) {
return r1.a * r2.b >= r1.b * r2.a;
}
// 足し算
friend Fraction operator+(const Fraction& r1, const Fraction& r2) {
return Fraction(r1.a * r2.b + r1.b * r2.a, r1.b * r2.b);
}
// 引き算
friend Fraction operator-(const Fraction& r1, const Fraction& r2) {
return Fraction(r1.a * r2.b - r1.b * r2.a, r1.b * r2.b);
}
// 掛け算
friend Fraction operator*(const Fraction& r1, const Fraction& r2) {
return Fraction(r1.a * r2.a, r1.b * r2.b);
}
// 割り算
friend Fraction operator/(const Fraction& r1, const Fraction& r2) {
return Fraction(r1.a * r2.b, r1.b * r2.a);
}
// 自身への足し算
Fraction& operator+=(const Fraction& r) { *this = *this + r; return *this; }
// 自身への引き算
Fraction& operator-=(const Fraction& r) { *this = *this - r; return *this; }
// 自身への掛け算
Fraction& operator*=(const Fraction& r) { *this = *this * r; return *this; }
// 自身への割り算
Fraction& operator/=(const Fraction& r) { *this = *this / r; return *this; }
// 出力
friend ostream& operator<<(ostream& os, const Fraction& r) {
os << r.a;
if (r.b != 1) os << '/' << r.b;
return os;
}
};
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
int main() {
// Input
int n;
cin >> n;
vector<Fraction<int>> v(n);
rep(i, n) cin >> v[i].a >> v[i].b;
// Output
sort(v.rbegin(), v.rend());
rep(i, n) cout << v[i].a << ' ' << v[i].b << endl;
}
gemy