結果
| 問題 | No.1999 Lattice Teleportation |
| コンテスト | |
| ユーザー |
MasKoaTS
|
| 提出日時 | 2022-06-24 17:06:04 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 153 ms / 2,000 ms |
| コード長 | 3,059 bytes |
| 記録 | |
| コンパイル時間 | 4,545 ms |
| コンパイル使用メモリ | 257,168 KB |
| 最終ジャッジ日時 | 2025-01-29 23:58:48 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 29 |
ソースコード
#include <math.h>
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
#define print(n) cout << (n) << endl
#define fprint(n) cout << setprecision(16) << (n) << endl
#define ceil_div(a, b) (((a) - 1) / (b) + 1)
#define rep(i, l, n) for (int i = (l); i < (n); i++)
#define itrep(itr, st) for (auto itr = st.begin(); itr != st.end(); itr++)
#define ite(i, a) for (auto& i : a)
#define all(x) x.begin(), x.end()
#define lb(A, x) (lower_bound(all(A), x) - A.begin())
#define ub(A, x) (upper_bound(all(A), x) - A.begin())
using str = string;
using ll = long long;
using u32 = unsigned int;
using u64 = unsigned long long;
using Pair = pair<int, int>;
using mint = modint1000000007;
using Mint = modint998244353;
template <class T> using V = vector<T>;
template <class T> using VV = V<V<T> >;
template <class T> using PQ = priority_queue<T, V<T>, greater<T> >;
template <class T> using PQR = priority_queue<T>;
template <class T> using BIT = fenwick_tree<T>;
const ll INF = 4611686018427387903;
const int inf = 2147483647;
const ll mod = 1000000007;
const ll MOD = 998244353;
template <class T> inline V<T> getList(int n) { V<T> res(n); rep(i, 0, n) { cin >> res[i]; }return res; }
template <class T> inline VV<T> getGrid(int m, int n) { VV<T> res(m, V<T>(n)); rep(i, 0, m) { res[i] = getList<T>(n); }return res; }
template <class T> inline void prints(V<T>& vec) { if (vec.size() == 0)return; cout << vec[0]; rep(i, 1, vec.size()) { cout << ' ' << vec[i]; } cout << '\n'; }
inline V<int> dtois(string& s) { V<int> vec = {}; ite(e, s) { vec.push_back(e - '0'); } return vec; }
inline V<int> atois(string& s) { V<int> vec = {}; ite(e, s) { vec.push_back(e - 'a'); } return vec; }
inline V<int> Atois(string& s) { V<int> vec = {}; ite(e, s) { vec.push_back(e - 'A'); } return vec; }
struct Vector2 {
ll x;
ll y;
Vector2() {
this->x = 0;
this->y = 0;
}
Vector2(ll x, ll y) {
this->x = x;
this->y = y;
}
};
ll gcd(ll a, ll b) {
a = abs(a); b = abs(b);
while (b != 0) {
ll r = a % b;
a = b;
b = r;
}
return a;
}
ll get_mod(ll n) {
if (n < 0) {
return mod - (-n) % mod;
}
return n % mod;
}
ll area(Vector2& v1, Vector2& v2) {
ll x1 = get_mod(v1.x), y1 = get_mod(v1.y);
ll x2 = get_mod(v2.x), y2 = get_mod(v2.y);
return get_mod(x1 * y2 % mod - x2 * y1 % mod);
}
bool arg_sort(const Vector2& v1, const Vector2& v2) {
ll x1 = v1.x, y1 = v1.y;
ll x2 = v2.x, y2 = v2.y;
return (x1 * y2 > x2 * y1);
}
int main(void) {
int tmp, n = 0; cin >> tmp;
V<Vector2> vector(tmp);
rep(i, 0, tmp) {
ll x, y; cin >> x >> y;
if (x == 0 and y == 0) {
continue;
}
if (y < 0) {
x = -x; y = -y;
}
vector[n] = Vector2(x, y);
n++;
}
vector.resize(n);
sort(all(vector), arg_sort);
ll S = 0, bh = 0;
ll lx = 0, ly = 0;
ite(v, vector) {
ll x = v.x, y = v.y;
Vector2 v1 = Vector2(lx, ly);
Vector2 v2 = Vector2(lx + x, ly + y);
S += area(v1, v2);
S %= mod;
bh += gcd(x, y);
bh %= mod;
lx = v2.x; ly = v2.y;
}
ll ans = (S + bh + 1) % mod;
print(ans);
return 0;
}
MasKoaTS