QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#799914 | #1449. Mountain Skyline | maspy# | AC ✓ | 16ms | 4184kb | C++23 | 49.3kb | 2024-12-05 19:32:48 | 2024-12-05 19:32:48 |
Judging History
answer
#line 1 "library/my_template.hpp"
#if defined(LOCAL)
#include <my_template_compiled.hpp>
#else
// https://codeforces.com/blog/entry/96344
#pragma GCC optimize("Ofast,unroll-loops")
// いまの CF だとこれ入れると動かない?
// #pragma GCC target("avx2,popcnt")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using u8 = uint8_t;
using u16 = uint16_t;
using u32 = uint32_t;
using u64 = uint64_t;
using i128 = __int128;
using u128 = unsigned __int128;
using f128 = __float128;
template <class T>
constexpr T infty = 0;
template <>
constexpr int infty<int> = 1'010'000'000;
template <>
constexpr ll infty<ll> = 2'020'000'000'000'000'000;
template <>
constexpr u32 infty<u32> = infty<int>;
template <>
constexpr u64 infty<u64> = infty<ll>;
template <>
constexpr i128 infty<i128> = i128(infty<ll>) * 2'000'000'000'000'000'000;
template <>
constexpr double infty<double> = infty<ll>;
template <>
constexpr long double infty<long double> = infty<ll>;
using pi = pair<ll, ll>;
using vi = vector<ll>;
template <class T>
using vc = vector<T>;
template <class T>
using vvc = vector<vc<T>>;
template <class T>
using vvvc = vector<vvc<T>>;
template <class T>
using vvvvc = vector<vvvc<T>>;
template <class T>
using vvvvvc = vector<vvvvc<T>>;
template <class T>
using pq = priority_queue<T>;
template <class T>
using pqg = priority_queue<T, vector<T>, greater<T>>;
#define vv(type, name, h, ...) vector<vector<type>> name(h, vector<type>(__VA_ARGS__))
#define vvv(type, name, h, w, ...) vector<vector<vector<type>>> name(h, vector<vector<type>>(w, vector<type>(__VA_ARGS__)))
#define vvvv(type, name, a, b, c, ...) \
vector<vector<vector<vector<type>>>> name(a, vector<vector<vector<type>>>(b, vector<vector<type>>(c, vector<type>(__VA_ARGS__))))
// https://trap.jp/post/1224/
#define FOR1(a) for (ll _ = 0; _ < ll(a); ++_)
#define FOR2(i, a) for (ll i = 0; i < ll(a); ++i)
#define FOR3(i, a, b) for (ll i = a; i < ll(b); ++i)
#define FOR4(i, a, b, c) for (ll i = a; i < ll(b); i += (c))
#define FOR1_R(a) for (ll i = (a)-1; i >= ll(0); --i)
#define FOR2_R(i, a) for (ll i = (a)-1; i >= ll(0); --i)
#define FOR3_R(i, a, b) for (ll i = (b)-1; i >= ll(a); --i)
#define overload4(a, b, c, d, e, ...) e
#define overload3(a, b, c, d, ...) d
#define FOR(...) overload4(__VA_ARGS__, FOR4, FOR3, FOR2, FOR1)(__VA_ARGS__)
#define FOR_R(...) overload3(__VA_ARGS__, FOR3_R, FOR2_R, FOR1_R)(__VA_ARGS__)
#define FOR_subset(t, s) for (ll t = (s); t >= 0; t = (t == 0 ? -1 : (t - 1) & (s)))
#define all(x) x.begin(), x.end()
#define len(x) ll(x.size())
#define elif else if
#define eb emplace_back
#define mp make_pair
#define mt make_tuple
#define fi first
#define se second
#define stoi stoll
int popcnt(int x) { return __builtin_popcount(x); }
int popcnt(u32 x) { return __builtin_popcount(x); }
int popcnt(ll x) { return __builtin_popcountll(x); }
int popcnt(u64 x) { return __builtin_popcountll(x); }
int popcnt_sgn(int x) { return (__builtin_parity(x) & 1 ? -1 : 1); }
int popcnt_sgn(u32 x) { return (__builtin_parity(x) & 1 ? -1 : 1); }
int popcnt_sgn(ll x) { return (__builtin_parity(x) & 1 ? -1 : 1); }
int popcnt_sgn(u64 x) { return (__builtin_parity(x) & 1 ? -1 : 1); }
// (0, 1, 2, 3, 4) -> (-1, 0, 1, 1, 2)
int topbit(int x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); }
int topbit(u32 x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); }
int topbit(ll x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); }
int topbit(u64 x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); }
// (0, 1, 2, 3, 4) -> (-1, 0, 1, 0, 2)
int lowbit(int x) { return (x == 0 ? -1 : __builtin_ctz(x)); }
int lowbit(u32 x) { return (x == 0 ? -1 : __builtin_ctz(x)); }
int lowbit(ll x) { return (x == 0 ? -1 : __builtin_ctzll(x)); }
int lowbit(u64 x) { return (x == 0 ? -1 : __builtin_ctzll(x)); }
template <typename T>
T kth_bit(int k) {
return T(1) << k;
}
template <typename T>
bool has_kth_bit(T x, int k) {
return x >> k & 1;
}
template <typename T>
T floor(T a, T b) {
return a / b - (a % b && (a ^ b) < 0);
}
template <typename T>
T ceil(T x, T y) {
return floor(x + y - 1, y);
}
template <typename T>
T bmod(T x, T y) {
return x - y * floor(x, y);
}
template <typename T>
pair<T, T> divmod(T x, T y) {
T q = floor(x, y);
return {q, x - q * y};
}
template <typename T, typename U>
T SUM(const vector<U> &A) {
T sm = 0;
for (auto &&a: A) sm += a;
return sm;
}
#define MIN(v) *min_element(all(v))
#define MAX(v) *max_element(all(v))
#define LB(c, x) distance((c).begin(), lower_bound(all(c), (x)))
#define UB(c, x) distance((c).begin(), upper_bound(all(c), (x)))
#define UNIQUE(x) sort(all(x)), x.erase(unique(all(x)), x.end()), x.shrink_to_fit()
template <typename T>
T POP(deque<T> &que) {
T a = que.front();
que.pop_front();
return a;
}
template <typename T>
T POP(pq<T> &que) {
T a = que.top();
que.pop();
return a;
}
template <typename T>
T POP(pqg<T> &que) {
T a = que.top();
que.pop();
return a;
}
template <typename T>
T POP(vc<T> &que) {
T a = que.back();
que.pop_back();
return a;
}
template <typename F>
ll binary_search(F check, ll ok, ll ng, bool check_ok = true) {
if (check_ok) assert(check(ok));
while (abs(ok - ng) > 1) {
auto x = (ng + ok) / 2;
(check(x) ? ok : ng) = x;
}
return ok;
}
template <typename F>
double binary_search_real(F check, double ok, double ng, int iter = 100) {
FOR(iter) {
double x = (ok + ng) / 2;
(check(x) ? ok : ng) = x;
}
return (ok + ng) / 2;
}
template <class T, class S>
inline bool chmax(T &a, const S &b) {
return (a < b ? a = b, 1 : 0);
}
template <class T, class S>
inline bool chmin(T &a, const S &b) {
return (a > b ? a = b, 1 : 0);
}
// ? は -1
vc<int> s_to_vi(const string &S, char first_char) {
vc<int> A(S.size());
FOR(i, S.size()) { A[i] = (S[i] != '?' ? S[i] - first_char : -1); }
return A;
}
template <typename T, typename U>
vector<T> cumsum(vector<U> &A, int off = 1) {
int N = A.size();
vector<T> B(N + 1);
FOR(i, N) { B[i + 1] = B[i] + A[i]; }
if (off == 0) B.erase(B.begin());
return B;
}
// stable sort
template <typename T>
vector<int> argsort(const vector<T> &A) {
vector<int> ids(len(A));
iota(all(ids), 0);
sort(all(ids), [&](int i, int j) { return (A[i] == A[j] ? i < j : A[i] < A[j]); });
return ids;
}
// A[I[0]], A[I[1]], ...
template <typename T>
vc<T> rearrange(const vc<T> &A, const vc<int> &I) {
vc<T> B(len(I));
FOR(i, len(I)) B[i] = A[I[i]];
return B;
}
template <typename T, typename... Vectors>
void concat(vc<T> &first, const Vectors &... others) {
vc<T> &res = first;
(res.insert(res.end(), others.begin(), others.end()), ...);
}
#endif
#line 1 "library/other/io.hpp"
#define FASTIO
#include <unistd.h>
// https://judge.yosupo.jp/submission/21623
namespace fastio {
static constexpr uint32_t SZ = 1 << 17;
char ibuf[SZ];
char obuf[SZ];
char out[100];
// pointer of ibuf, obuf
uint32_t pil = 0, pir = 0, por = 0;
struct Pre {
char num[10000][4];
constexpr Pre() : num() {
for (int i = 0; i < 10000; i++) {
int n = i;
for (int j = 3; j >= 0; j--) {
num[i][j] = n % 10 | '0';
n /= 10;
}
}
}
} constexpr pre;
inline void load() {
memcpy(ibuf, ibuf + pil, pir - pil);
pir = pir - pil + fread(ibuf + pir - pil, 1, SZ - pir + pil, stdin);
pil = 0;
if (pir < SZ) ibuf[pir++] = '\n';
}
inline void flush() {
fwrite(obuf, 1, por, stdout);
por = 0;
}
void rd(char &c) {
do {
if (pil + 1 > pir) load();
c = ibuf[pil++];
} while (isspace(c));
}
void rd(string &x) {
x.clear();
char c;
do {
if (pil + 1 > pir) load();
c = ibuf[pil++];
} while (isspace(c));
do {
x += c;
if (pil == pir) load();
c = ibuf[pil++];
} while (!isspace(c));
}
template <typename T>
void rd_real(T &x) {
string s;
rd(s);
x = stod(s);
}
template <typename T>
void rd_integer(T &x) {
if (pil + 100 > pir) load();
char c;
do
c = ibuf[pil++];
while (c < '-');
bool minus = 0;
if constexpr (is_signed<T>::value || is_same_v<T, i128>) {
if (c == '-') { minus = 1, c = ibuf[pil++]; }
}
x = 0;
while ('0' <= c) { x = x * 10 + (c & 15), c = ibuf[pil++]; }
if constexpr (is_signed<T>::value || is_same_v<T, i128>) {
if (minus) x = -x;
}
}
void rd(int &x) { rd_integer(x); }
void rd(ll &x) { rd_integer(x); }
void rd(i128 &x) { rd_integer(x); }
void rd(u32 &x) { rd_integer(x); }
void rd(u64 &x) { rd_integer(x); }
void rd(u128 &x) { rd_integer(x); }
void rd(double &x) { rd_real(x); }
void rd(long double &x) { rd_real(x); }
void rd(f128 &x) { rd_real(x); }
template <class T, class U>
void rd(pair<T, U> &p) {
return rd(p.first), rd(p.second);
}
template <size_t N = 0, typename T>
void rd_tuple(T &t) {
if constexpr (N < std::tuple_size<T>::value) {
auto &x = std::get<N>(t);
rd(x);
rd_tuple<N + 1>(t);
}
}
template <class... T>
void rd(tuple<T...> &tpl) {
rd_tuple(tpl);
}
template <size_t N = 0, typename T>
void rd(array<T, N> &x) {
for (auto &d: x) rd(d);
}
template <class T>
void rd(vc<T> &x) {
for (auto &d: x) rd(d);
}
void read() {}
template <class H, class... T>
void read(H &h, T &... t) {
rd(h), read(t...);
}
void wt(const char c) {
if (por == SZ) flush();
obuf[por++] = c;
}
void wt(const string s) {
for (char c: s) wt(c);
}
void wt(const char *s) {
size_t len = strlen(s);
for (size_t i = 0; i < len; i++) wt(s[i]);
}
template <typename T>
void wt_integer(T x) {
if (por > SZ - 100) flush();
if (x < 0) { obuf[por++] = '-', x = -x; }
int outi;
for (outi = 96; x >= 10000; outi -= 4) {
memcpy(out + outi, pre.num[x % 10000], 4);
x /= 10000;
}
if (x >= 1000) {
memcpy(obuf + por, pre.num[x], 4);
por += 4;
} else if (x >= 100) {
memcpy(obuf + por, pre.num[x] + 1, 3);
por += 3;
} else if (x >= 10) {
int q = (x * 103) >> 10;
obuf[por] = q | '0';
obuf[por + 1] = (x - q * 10) | '0';
por += 2;
} else
obuf[por++] = x | '0';
memcpy(obuf + por, out + outi + 4, 96 - outi);
por += 96 - outi;
}
template <typename T>
void wt_real(T x) {
ostringstream oss;
oss << fixed << setprecision(15) << double(x);
string s = oss.str();
wt(s);
}
void wt(int x) { wt_integer(x); }
void wt(ll x) { wt_integer(x); }
void wt(i128 x) { wt_integer(x); }
void wt(u32 x) { wt_integer(x); }
void wt(u64 x) { wt_integer(x); }
void wt(u128 x) { wt_integer(x); }
void wt(double x) { wt_real(x); }
void wt(long double x) { wt_real(x); }
void wt(f128 x) { wt_real(x); }
template <class T, class U>
void wt(const pair<T, U> val) {
wt(val.first);
wt(' ');
wt(val.second);
}
template <size_t N = 0, typename T>
void wt_tuple(const T t) {
if constexpr (N < std::tuple_size<T>::value) {
if constexpr (N > 0) { wt(' '); }
const auto x = std::get<N>(t);
wt(x);
wt_tuple<N + 1>(t);
}
}
template <class... T>
void wt(tuple<T...> tpl) {
wt_tuple(tpl);
}
template <class T, size_t S>
void wt(const array<T, S> val) {
auto n = val.size();
for (size_t i = 0; i < n; i++) {
if (i) wt(' ');
wt(val[i]);
}
}
template <class T>
void wt(const vector<T> val) {
auto n = val.size();
for (size_t i = 0; i < n; i++) {
if (i) wt(' ');
wt(val[i]);
}
}
void print() { wt('\n'); }
template <class Head, class... Tail>
void print(Head &&head, Tail &&... tail) {
wt(head);
if (sizeof...(Tail)) wt(' ');
print(forward<Tail>(tail)...);
}
// gcc expansion. called automaticall after main.
void __attribute__((destructor)) _d() { flush(); }
} // namespace fastio
using fastio::read;
using fastio::print;
using fastio::flush;
#if defined(LOCAL)
#define SHOW(...) SHOW_IMPL(__VA_ARGS__, SHOW6, SHOW5, SHOW4, SHOW3, SHOW2, SHOW1)(__VA_ARGS__)
#define SHOW_IMPL(_1, _2, _3, _4, _5, _6, NAME, ...) NAME
#define SHOW1(x) print(#x, "=", (x)), flush()
#define SHOW2(x, y) print(#x, "=", (x), #y, "=", (y)), flush()
#define SHOW3(x, y, z) print(#x, "=", (x), #y, "=", (y), #z, "=", (z)), flush()
#define SHOW4(x, y, z, w) print(#x, "=", (x), #y, "=", (y), #z, "=", (z), #w, "=", (w)), flush()
#define SHOW5(x, y, z, w, v) print(#x, "=", (x), #y, "=", (y), #z, "=", (z), #w, "=", (w), #v, "=", (v)), flush()
#define SHOW6(x, y, z, w, v, u) print(#x, "=", (x), #y, "=", (y), #z, "=", (z), #w, "=", (w), #v, "=", (v), #u, "=", (u)), flush()
#else
#define SHOW(...)
#endif
#define INT(...) \
int __VA_ARGS__; \
read(__VA_ARGS__)
#define LL(...) \
ll __VA_ARGS__; \
read(__VA_ARGS__)
#define U32(...) \
u32 __VA_ARGS__; \
read(__VA_ARGS__)
#define U64(...) \
u64 __VA_ARGS__; \
read(__VA_ARGS__)
#define STR(...) \
string __VA_ARGS__; \
read(__VA_ARGS__)
#define CHAR(...) \
char __VA_ARGS__; \
read(__VA_ARGS__)
#define DBL(...) \
double __VA_ARGS__; \
read(__VA_ARGS__)
#define VEC(type, name, size) \
vector<type> name(size); \
read(name)
#define VV(type, name, h, w) \
vector<vector<type>> name(h, vector<type>(w)); \
read(name)
void YES(bool t = 1) { print(t ? "YES" : "NO"); }
void NO(bool t = 1) { YES(!t); }
void Yes(bool t = 1) { print(t ? "Yes" : "No"); }
void No(bool t = 1) { Yes(!t); }
void yes(bool t = 1) { print(t ? "yes" : "no"); }
void no(bool t = 1) { yes(!t); }
void YA(bool t = 1) { print(t ? "YA" : "TIDAK"); }
void TIDAK(bool t = 1) { YES(!t); }
#line 3 "main.cpp"
#line 2 "library/mod/modint_common.hpp"
struct has_mod_impl {
template <class T>
static auto check(T &&x) -> decltype(x.get_mod(), std::true_type{});
template <class T>
static auto check(...) -> std::false_type;
};
template <class T>
class has_mod : public decltype(has_mod_impl::check<T>(std::declval<T>())) {};
template <typename mint>
mint inv(int n) {
static const int mod = mint::get_mod();
static vector<mint> dat = {0, 1};
assert(0 <= n);
if (n >= mod) n %= mod;
while (len(dat) <= n) {
int k = len(dat);
int q = (mod + k - 1) / k;
dat.eb(dat[k * q - mod] * mint::raw(q));
}
return dat[n];
}
template <typename mint>
mint fact(int n) {
static const int mod = mint::get_mod();
assert(0 <= n && n < mod);
static vector<mint> dat = {1, 1};
while (len(dat) <= n) dat.eb(dat[len(dat) - 1] * mint::raw(len(dat)));
return dat[n];
}
template <typename mint>
mint fact_inv(int n) {
static vector<mint> dat = {1, 1};
if (n < 0) return mint(0);
while (len(dat) <= n) dat.eb(dat[len(dat) - 1] * inv<mint>(len(dat)));
return dat[n];
}
template <class mint, class... Ts>
mint fact_invs(Ts... xs) {
return (mint(1) * ... * fact_inv<mint>(xs));
}
template <typename mint, class Head, class... Tail>
mint multinomial(Head &&head, Tail &&... tail) {
return fact<mint>(head) * fact_invs<mint>(std::forward<Tail>(tail)...);
}
template <typename mint>
mint C_dense(int n, int k) {
assert(n >= 0);
if (k < 0 || n < k) return 0;
static vvc<mint> C;
static int H = 0, W = 0;
auto calc = [&](int i, int j) -> mint {
if (i == 0) return (j == 0 ? mint(1) : mint(0));
return C[i - 1][j] + (j ? C[i - 1][j - 1] : 0);
};
if (W <= k) {
FOR(i, H) {
C[i].resize(k + 1);
FOR(j, W, k + 1) { C[i][j] = calc(i, j); }
}
W = k + 1;
}
if (H <= n) {
C.resize(n + 1);
FOR(i, H, n + 1) {
C[i].resize(W);
FOR(j, W) { C[i][j] = calc(i, j); }
}
H = n + 1;
}
return C[n][k];
}
template <typename mint, bool large = false, bool dense = false>
mint C(ll n, ll k) {
assert(n >= 0);
if (k < 0 || n < k) return 0;
if constexpr (dense) return C_dense<mint>(n, k);
if constexpr (!large) return multinomial<mint>(n, k, n - k);
k = min(k, n - k);
mint x(1);
FOR(i, k) x *= mint(n - i);
return x * fact_inv<mint>(k);
}
template <typename mint, bool large = false>
mint C_inv(ll n, ll k) {
assert(n >= 0);
assert(0 <= k && k <= n);
if (!large) return fact_inv<mint>(n) * fact<mint>(k) * fact<mint>(n - k);
return mint(1) / C<mint, 1>(n, k);
}
// [x^d](1-x)^{-n}
template <typename mint, bool large = false, bool dense = false>
mint C_negative(ll n, ll d) {
assert(n >= 0);
if (d < 0) return mint(0);
if (n == 0) { return (d == 0 ? mint(1) : mint(0)); }
return C<mint, large, dense>(n + d - 1, d);
}
#line 3 "library/mod/modint.hpp"
template <int mod>
struct modint {
static constexpr u32 umod = u32(mod);
static_assert(umod < u32(1) << 31);
u32 val;
static modint raw(u32 v) {
modint x;
x.val = v;
return x;
}
constexpr modint() : val(0) {}
constexpr modint(u32 x) : val(x % umod) {}
constexpr modint(u64 x) : val(x % umod) {}
constexpr modint(u128 x) : val(x % umod) {}
constexpr modint(int x) : val((x %= mod) < 0 ? x + mod : x){};
constexpr modint(ll x) : val((x %= mod) < 0 ? x + mod : x){};
constexpr modint(i128 x) : val((x %= mod) < 0 ? x + mod : x){};
bool operator<(const modint &other) const { return val < other.val; }
modint &operator+=(const modint &p) {
if ((val += p.val) >= umod) val -= umod;
return *this;
}
modint &operator-=(const modint &p) {
if ((val += umod - p.val) >= umod) val -= umod;
return *this;
}
modint &operator*=(const modint &p) {
val = u64(val) * p.val % umod;
return *this;
}
modint &operator/=(const modint &p) {
*this *= p.inverse();
return *this;
}
modint operator-() const { return modint::raw(val ? mod - val : u32(0)); }
modint operator+(const modint &p) const { return modint(*this) += p; }
modint operator-(const modint &p) const { return modint(*this) -= p; }
modint operator*(const modint &p) const { return modint(*this) *= p; }
modint operator/(const modint &p) const { return modint(*this) /= p; }
bool operator==(const modint &p) const { return val == p.val; }
bool operator!=(const modint &p) const { return val != p.val; }
modint inverse() const {
int a = val, b = mod, u = 1, v = 0, t;
while (b > 0) {
t = a / b;
swap(a -= t * b, b), swap(u -= t * v, v);
}
return modint(u);
}
modint pow(ll n) const {
assert(n >= 0);
modint ret(1), mul(val);
while (n > 0) {
if (n & 1) ret *= mul;
mul *= mul;
n >>= 1;
}
return ret;
}
static constexpr int get_mod() { return mod; }
// (n, r), r は 1 の 2^n 乗根
static constexpr pair<int, int> ntt_info() {
if (mod == 120586241) return {20, 74066978};
if (mod == 167772161) return {25, 17};
if (mod == 469762049) return {26, 30};
if (mod == 754974721) return {24, 362};
if (mod == 880803841) return {23, 211};
if (mod == 943718401) return {22, 663003469};
if (mod == 998244353) return {23, 31};
if (mod == 1004535809) return {21, 582313106};
if (mod == 1012924417) return {21, 368093570};
return {-1, -1};
}
static constexpr bool can_ntt() { return ntt_info().fi != -1; }
};
#ifdef FASTIO
template <int mod>
void rd(modint<mod> &x) {
fastio::rd(x.val);
x.val %= mod;
// assert(0 <= x.val && x.val < mod);
}
template <int mod>
void wt(modint<mod> x) {
fastio::wt(x.val);
}
#endif
using modint107 = modint<1000000007>;
using modint998 = modint<998244353>;
#line 2 "library/mod/mod_inv.hpp"
// long でも大丈夫
// (val * x - 1) が mod の倍数になるようにする
// 特に mod=0 なら x=0 が満たす
ll mod_inv(ll val, ll mod) {
if (mod == 0) return 0;
mod = abs(mod);
val %= mod;
if (val < 0) val += mod;
ll a = val, b = mod, u = 1, v = 0, t;
while (b > 0) {
t = a / b;
swap(a -= t * b, b), swap(u -= t * v, v);
}
if (u < 0) u += mod;
return u;
}
#line 2 "library/mod/crt3.hpp"
constexpr u32 mod_pow_constexpr(u64 a, u64 n, u32 mod) {
a %= mod;
u64 res = 1;
FOR(32) {
if (n & 1) res = res * a % mod;
a = a * a % mod, n /= 2;
}
return res;
}
template <typename T, u32 p0, u32 p1>
T CRT2(u64 a0, u64 a1) {
static_assert(p0 < p1);
static constexpr u64 x0_1 = mod_pow_constexpr(p0, p1 - 2, p1);
u64 c = (a1 - a0 + p1) * x0_1 % p1;
return a0 + c * p0;
}
template <typename T, u32 p0, u32 p1, u32 p2>
T CRT3(u64 a0, u64 a1, u64 a2) {
static_assert(p0 < p1 && p1 < p2);
static constexpr u64 x1 = mod_pow_constexpr(p0, p1 - 2, p1);
static constexpr u64 x2 = mod_pow_constexpr(u64(p0) * p1 % p2, p2 - 2, p2);
static constexpr u64 p01 = u64(p0) * p1;
u64 c = (a1 - a0 + p1) * x1 % p1;
u64 ans_1 = a0 + c * p0;
c = (a2 - ans_1 % p2 + p2) * x2 % p2;
return T(ans_1) + T(c) * T(p01);
}
template <typename T, u32 p0, u32 p1, u32 p2, u32 p3>
T CRT4(u64 a0, u64 a1, u64 a2, u64 a3) {
static_assert(p0 < p1 && p1 < p2 && p2 < p3);
static constexpr u64 x1 = mod_pow_constexpr(p0, p1 - 2, p1);
static constexpr u64 x2 = mod_pow_constexpr(u64(p0) * p1 % p2, p2 - 2, p2);
static constexpr u64 x3 = mod_pow_constexpr(u64(p0) * p1 % p3 * p2 % p3, p3 - 2, p3);
static constexpr u64 p01 = u64(p0) * p1;
u64 c = (a1 - a0 + p1) * x1 % p1;
u64 ans_1 = a0 + c * p0;
c = (a2 - ans_1 % p2 + p2) * x2 % p2;
u128 ans_2 = ans_1 + c * static_cast<u128>(p01);
c = (a3 - ans_2 % p3 + p3) * x3 % p3;
return T(ans_2) + T(c) * T(p01) * T(p2);
}
template <typename T, u32 p0, u32 p1, u32 p2, u32 p3, u32 p4>
T CRT5(u64 a0, u64 a1, u64 a2, u64 a3, u64 a4) {
static_assert(p0 < p1 && p1 < p2 && p2 < p3 && p3 < p4);
static constexpr u64 x1 = mod_pow_constexpr(p0, p1 - 2, p1);
static constexpr u64 x2 = mod_pow_constexpr(u64(p0) * p1 % p2, p2 - 2, p2);
static constexpr u64 x3 = mod_pow_constexpr(u64(p0) * p1 % p3 * p2 % p3, p3 - 2, p3);
static constexpr u64 x4 = mod_pow_constexpr(u64(p0) * p1 % p4 * p2 % p4 * p3 % p4, p4 - 2, p4);
static constexpr u64 p01 = u64(p0) * p1;
static constexpr u64 p23 = u64(p2) * p3;
u64 c = (a1 - a0 + p1) * x1 % p1;
u64 ans_1 = a0 + c * p0;
c = (a2 - ans_1 % p2 + p2) * x2 % p2;
u128 ans_2 = ans_1 + c * static_cast<u128>(p01);
c = static_cast<u64>(a3 - ans_2 % p3 + p3) * x3 % p3;
u128 ans_3 = ans_2 + static_cast<u128>(c * p2) * p01;
c = static_cast<u64>(a4 - ans_3 % p4 + p4) * x4 % p4;
return T(ans_3) + T(c) * T(p01) * T(p23);
}
#line 2 "library/poly/convolution_naive.hpp"
template <class T, typename enable_if<!has_mod<T>::value>::type* = nullptr>
vc<T> convolution_naive(const vc<T>& a, const vc<T>& b) {
int n = int(a.size()), m = int(b.size());
if (n > m) return convolution_naive<T>(b, a);
if (n == 0) return {};
vector<T> ans(n + m - 1);
FOR(i, n) FOR(j, m) ans[i + j] += a[i] * b[j];
return ans;
}
template <class T, typename enable_if<has_mod<T>::value>::type* = nullptr>
vc<T> convolution_naive(const vc<T>& a, const vc<T>& b) {
int n = int(a.size()), m = int(b.size());
if (n > m) return convolution_naive<T>(b, a);
if (n == 0) return {};
vc<T> ans(n + m - 1);
if (n <= 16 && (T::get_mod() < (1 << 30))) {
for (int k = 0; k < n + m - 1; ++k) {
int s = max(0, k - m + 1);
int t = min(n, k + 1);
u64 sm = 0;
for (int i = s; i < t; ++i) { sm += u64(a[i].val) * (b[k - i].val); }
ans[k] = sm;
}
} else {
for (int k = 0; k < n + m - 1; ++k) {
int s = max(0, k - m + 1);
int t = min(n, k + 1);
u128 sm = 0;
for (int i = s; i < t; ++i) { sm += u64(a[i].val) * (b[k - i].val); }
ans[k] = T::raw(sm % T::get_mod());
}
}
return ans;
}
#line 2 "library/poly/convolution_karatsuba.hpp"
// 任意の環でできる
template <typename T>
vc<T> convolution_karatsuba(const vc<T>& f, const vc<T>& g) {
const int thresh = 30;
if (min(len(f), len(g)) <= thresh) return convolution_naive(f, g);
int n = max(len(f), len(g));
int m = ceil(n, 2);
vc<T> f1, f2, g1, g2;
if (len(f) < m) f1 = f;
if (len(f) >= m) f1 = {f.begin(), f.begin() + m};
if (len(f) >= m) f2 = {f.begin() + m, f.end()};
if (len(g) < m) g1 = g;
if (len(g) >= m) g1 = {g.begin(), g.begin() + m};
if (len(g) >= m) g2 = {g.begin() + m, g.end()};
vc<T> a = convolution_karatsuba(f1, g1);
vc<T> b = convolution_karatsuba(f2, g2);
FOR(i, len(f2)) f1[i] += f2[i];
FOR(i, len(g2)) g1[i] += g2[i];
vc<T> c = convolution_karatsuba(f1, g1);
vc<T> F(len(f) + len(g) - 1);
assert(2 * m + len(b) <= len(F));
FOR(i, len(a)) F[i] += a[i], c[i] -= a[i];
FOR(i, len(b)) F[2 * m + i] += b[i], c[i] -= b[i];
if (c.back() == T(0)) c.pop_back();
FOR(i, len(c)) if (c[i] != T(0)) F[m + i] += c[i];
return F;
}
#line 2 "library/poly/ntt.hpp"
template <class mint>
void ntt(vector<mint>& a, bool inverse) {
assert(mint::can_ntt());
const int rank2 = mint::ntt_info().fi;
const int mod = mint::get_mod();
static array<mint, 30> root, iroot;
static array<mint, 30> rate2, irate2;
static array<mint, 30> rate3, irate3;
assert(rank2 != -1 && len(a) <= (1 << max(0, rank2)));
static bool prepared = 0;
if (!prepared) {
prepared = 1;
root[rank2] = mint::ntt_info().se;
iroot[rank2] = mint(1) / root[rank2];
FOR_R(i, rank2) {
root[i] = root[i + 1] * root[i + 1];
iroot[i] = iroot[i + 1] * iroot[i + 1];
}
mint prod = 1, iprod = 1;
for (int i = 0; i <= rank2 - 2; i++) {
rate2[i] = root[i + 2] * prod;
irate2[i] = iroot[i + 2] * iprod;
prod *= iroot[i + 2];
iprod *= root[i + 2];
}
prod = 1, iprod = 1;
for (int i = 0; i <= rank2 - 3; i++) {
rate3[i] = root[i + 3] * prod;
irate3[i] = iroot[i + 3] * iprod;
prod *= iroot[i + 3];
iprod *= root[i + 3];
}
}
int n = int(a.size());
int h = topbit(n);
assert(n == 1 << h);
if (!inverse) {
int len = 0;
while (len < h) {
if (h - len == 1) {
int p = 1 << (h - len - 1);
mint rot = 1;
FOR(s, 1 << len) {
int offset = s << (h - len);
FOR(i, p) {
auto l = a[i + offset];
auto r = a[i + offset + p] * rot;
a[i + offset] = l + r;
a[i + offset + p] = l - r;
}
rot *= rate2[topbit(~s & -~s)];
}
len++;
} else {
int p = 1 << (h - len - 2);
mint rot = 1, imag = root[2];
for (int s = 0; s < (1 << len); s++) {
mint rot2 = rot * rot;
mint rot3 = rot2 * rot;
int offset = s << (h - len);
for (int i = 0; i < p; i++) {
u64 mod2 = u64(mod) * mod;
u64 a0 = a[i + offset].val;
u64 a1 = u64(a[i + offset + p].val) * rot.val;
u64 a2 = u64(a[i + offset + 2 * p].val) * rot2.val;
u64 a3 = u64(a[i + offset + 3 * p].val) * rot3.val;
u64 a1na3imag = (a1 + mod2 - a3) % mod * imag.val;
u64 na2 = mod2 - a2;
a[i + offset] = a0 + a2 + a1 + a3;
a[i + offset + 1 * p] = a0 + a2 + (2 * mod2 - (a1 + a3));
a[i + offset + 2 * p] = a0 + na2 + a1na3imag;
a[i + offset + 3 * p] = a0 + na2 + (mod2 - a1na3imag);
}
rot *= rate3[topbit(~s & -~s)];
}
len += 2;
}
}
} else {
mint coef = mint(1) / mint(len(a));
FOR(i, len(a)) a[i] *= coef;
int len = h;
while (len) {
if (len == 1) {
int p = 1 << (h - len);
mint irot = 1;
FOR(s, 1 << (len - 1)) {
int offset = s << (h - len + 1);
FOR(i, p) {
u64 l = a[i + offset].val;
u64 r = a[i + offset + p].val;
a[i + offset] = l + r;
a[i + offset + p] = (mod + l - r) * irot.val;
}
irot *= irate2[topbit(~s & -~s)];
}
len--;
} else {
int p = 1 << (h - len);
mint irot = 1, iimag = iroot[2];
FOR(s, (1 << (len - 2))) {
mint irot2 = irot * irot;
mint irot3 = irot2 * irot;
int offset = s << (h - len + 2);
for (int i = 0; i < p; i++) {
u64 a0 = a[i + offset + 0 * p].val;
u64 a1 = a[i + offset + 1 * p].val;
u64 a2 = a[i + offset + 2 * p].val;
u64 a3 = a[i + offset + 3 * p].val;
u64 x = (mod + a2 - a3) * iimag.val % mod;
a[i + offset] = a0 + a1 + a2 + a3;
a[i + offset + 1 * p] = (a0 + mod - a1 + x) * irot.val;
a[i + offset + 2 * p] = (a0 + a1 + 2 * mod - a2 - a3) * irot2.val;
a[i + offset + 3 * p] = (a0 + 2 * mod - a1 - x) * irot3.val;
}
irot *= irate3[topbit(~s & -~s)];
}
len -= 2;
}
}
}
}
#line 8 "library/poly/convolution.hpp"
template <class mint>
vector<mint> convolution_ntt(vector<mint> a, vector<mint> b) {
if (a.empty() || b.empty()) return {};
int n = int(a.size()), m = int(b.size());
int sz = 1;
while (sz < n + m - 1) sz *= 2;
// sz = 2^k のときの高速化。分割統治的なやつで損しまくるので。
if ((n + m - 3) <= sz / 2) {
auto a_last = a.back(), b_last = b.back();
a.pop_back(), b.pop_back();
auto c = convolution(a, b);
c.resize(n + m - 1);
c[n + m - 2] = a_last * b_last;
FOR(i, len(a)) c[i + len(b)] += a[i] * b_last;
FOR(i, len(b)) c[i + len(a)] += b[i] * a_last;
return c;
}
a.resize(sz), b.resize(sz);
bool same = a == b;
ntt(a, 0);
if (same) {
b = a;
} else {
ntt(b, 0);
}
FOR(i, sz) a[i] *= b[i];
ntt(a, 1);
a.resize(n + m - 1);
return a;
}
template <typename mint>
vector<mint> convolution_garner(const vector<mint>& a, const vector<mint>& b) {
int n = len(a), m = len(b);
if (!n || !m) return {};
static constexpr int p0 = 167772161;
static constexpr int p1 = 469762049;
static constexpr int p2 = 754974721;
using mint0 = modint<p0>;
using mint1 = modint<p1>;
using mint2 = modint<p2>;
vc<mint0> a0(n), b0(m);
vc<mint1> a1(n), b1(m);
vc<mint2> a2(n), b2(m);
FOR(i, n) a0[i] = a[i].val, a1[i] = a[i].val, a2[i] = a[i].val;
FOR(i, m) b0[i] = b[i].val, b1[i] = b[i].val, b2[i] = b[i].val;
auto c0 = convolution_ntt<mint0>(a0, b0);
auto c1 = convolution_ntt<mint1>(a1, b1);
auto c2 = convolution_ntt<mint2>(a2, b2);
vc<mint> c(len(c0));
FOR(i, n + m - 1) { c[i] = CRT3<mint, p0, p1, p2>(c0[i].val, c1[i].val, c2[i].val); }
return c;
}
vector<ll> convolution(vector<ll> a, vector<ll> b) {
int n = len(a), m = len(b);
if (!n || !m) return {};
if (min(n, m) <= 2500) return convolution_naive(a, b);
ll mi_a = MIN(a), mi_b = MIN(b);
for (auto& x: a) x -= mi_a;
for (auto& x: b) x -= mi_b;
assert(MAX(a) * MAX(b) <= 1e18);
auto Ac = cumsum<ll>(a), Bc = cumsum<ll>(b);
vi res(n + m - 1);
for (int k = 0; k < n + m - 1; ++k) {
int s = max(0, k - m + 1);
int t = min(n, k + 1);
res[k] += (t - s) * mi_a * mi_b;
res[k] += mi_a * (Bc[k - s + 1] - Bc[k - t + 1]);
res[k] += mi_b * (Ac[t] - Ac[s]);
}
static constexpr u32 MOD1 = 1004535809;
static constexpr u32 MOD2 = 1012924417;
using mint1 = modint<MOD1>;
using mint2 = modint<MOD2>;
vc<mint1> a1(n), b1(m);
vc<mint2> a2(n), b2(m);
FOR(i, n) a1[i] = a[i], a2[i] = a[i];
FOR(i, m) b1[i] = b[i], b2[i] = b[i];
auto c1 = convolution_ntt<mint1>(a1, b1);
auto c2 = convolution_ntt<mint2>(a2, b2);
FOR(i, n + m - 1) { res[i] += CRT2<u64, MOD1, MOD2>(c1[i].val, c2[i].val); }
return res;
}
template <typename mint>
vc<mint> convolution(const vc<mint>& a, const vc<mint>& b) {
int n = len(a), m = len(b);
if (!n || !m) return {};
if (mint::can_ntt()) {
if (min(n, m) <= 50) return convolution_karatsuba<mint>(a, b);
return convolution_ntt(a, b);
}
if (min(n, m) <= 200) return convolution_karatsuba<mint>(a, b);
return convolution_garner(a, b);
}
#line 2 "library/nt/digit_sum.hpp"
int digit_sum(u64 x) {
const int K = 100'000;
static vc<int> dp(K);
if (dp[1] == 0) { FOR(x, 1, K) dp[x] = dp[x / 10] + (x % 10); }
int res = 0;
while (x) {
res += dp[x % K];
x /= K;
}
return res;
}
#line 3 "library/bigint/base.hpp"
// 10^9 ずつ区切って
struct BigInteger {
static constexpr int TEN[]
= {1, 10, 100, 1000, 10000,
100000, 1000000, 10000000, 100000000, 1000000000};
static constexpr int LOG = 9;
static constexpr int MOD = TEN[LOG];
using bint = BigInteger;
int sgn;
vc<int> dat;
BigInteger() : sgn(0) {}
BigInteger(i128 val) {
if (val == 0) {
sgn = 0;
return;
}
sgn = 1;
if (val != 0) {
if (val < 0) sgn = -1, val = -val;
while (val > 0) { dat.eb(val % MOD), val /= MOD; }
}
}
BigInteger(string s) {
assert(!s.empty());
sgn = 1;
if (s[0] == '-') {
sgn = -1;
s.erase(s.begin());
assert(!s.empty());
}
if (s[0] == '0') {
sgn = 0;
return;
}
reverse(all(s));
int n = len(s);
int m = ceil(n, LOG);
dat.assign(m, 0);
FOR(i, n) { dat[i / LOG] += TEN[i % LOG] * (s[i] - '0'); }
}
bint &operator=(const bint &p) {
sgn = p.sgn, dat = p.dat;
return *this;
}
bool operator<(const bint &p) const {
if (sgn != p.sgn) { return sgn < p.sgn; }
if (sgn == 0) return false;
if (len(dat) != len(p.dat)) {
if (sgn == 1) return len(dat) < len(p.dat);
if (sgn == -1) return len(dat) > len(p.dat);
}
FOR_R(i, len(dat)) {
if (dat[i] == p.dat[i]) continue;
if (sgn == 1) return dat[i] < p.dat[i];
if (sgn == -1) return dat[i] > p.dat[i];
}
return false;
}
bool operator>(const bint &p) const { return p < *this; }
bool operator<=(const bint &p) const { return !(*this > p); }
bool operator>=(const bint &p) const { return !(*this < p); }
bint &operator+=(const bint p) {
if (sgn == 0) { return *this = p; }
if (p.sgn == 0) return *this;
if (sgn != p.sgn) {
*this -= (-p);
return *this;
}
int n = max(len(dat), len(p.dat));
dat.resize(n + 1);
FOR(i, n) {
if (i < len(p.dat)) dat[i] += p.dat[i];
if (dat[i] >= MOD) dat[i] -= MOD, dat[i + 1] += 1;
}
while (len(dat) && dat.back() == 0) dat.pop_back();
if (dat.empty()) sgn = 0;
return *this;
}
bint &operator-=(const bint p) {
if (p.sgn == 0) return *this;
if (sgn == 0) return *this = (-p);
if (sgn != p.sgn) {
*this += (-p);
return *this;
}
if ((sgn == 1 && *this < p) || (sgn == -1 && *this > p)) {
*this = p - *this;
sgn = -sgn;
return *this;
}
FOR(i, len(p.dat)) { dat[i] -= p.dat[i]; }
FOR(i, len(dat) - 1) {
if (dat[i] < 0) dat[i] += MOD, dat[i + 1] -= 1;
}
while (len(dat) && dat.back() == 0) { dat.pop_back(); }
if (dat.empty()) sgn = 0;
return *this;
}
bint &operator*=(const bint &p) {
sgn *= p.sgn;
if (sgn == 0) {
dat.clear();
} else {
dat = convolve(dat, p.dat);
}
return *this;
}
// bint &operator/=(const bint &p) { return *this; }
bint operator-() const {
bint p = *this;
p.sgn *= -1;
return p;
}
bint operator+(const bint &p) const { return bint(*this) += p; }
bint operator-(const bint &p) const { return bint(*this) -= p; }
bint operator*(const bint &p) const { return bint(*this) *= p; }
// bint operator/(const modint &p) const { return modint(*this) /= p; }
bool operator==(const bint &p) const {
return (sgn == p.sgn && dat == p.dat);
}
bool operator!=(const bint &p) const { return !((*this) == p); }
vc<int> convolve(const vc<int> &a, const vc<int> &b) {
int n = len(a), m = len(b);
if (!n || !m) return {};
if (min(n, m) <= 500) {
vc<int> c(n + m - 1);
u128 x = 0;
FOR(k, n + m - 1) {
int s = max<int>(0, k + 1 - m), t = min<int>(k, n - 1);
FOR(i, s, t + 1) { x += u64(a[i]) * b[k - i]; }
c[k] = x % MOD, x = x / MOD;
}
while (x > 0) { c.eb(x % MOD), x = x / MOD; }
return c;
}
static constexpr int p0 = 167772161;
static constexpr int p1 = 469762049;
static constexpr int p2 = 754974721;
using mint0 = modint<p0>;
using mint1 = modint<p1>;
using mint2 = modint<p2>;
vc<mint0> a0(all(a)), b0(all(b));
vc<mint1> a1(all(a)), b1(all(b));
vc<mint2> a2(all(a)), b2(all(b));
auto c0 = convolution_ntt<mint0>(a0, b0);
auto c1 = convolution_ntt<mint1>(a1, b1);
auto c2 = convolution_ntt<mint2>(a2, b2);
vc<int> c(len(c0));
u128 x = 0;
FOR(i, n + m - 1) {
x += CRT3<u128, p0, p1, p2>(c0[i].val, c1[i].val, c2[i].val);
c[i] = x % MOD, x = x / MOD;
}
while (x) { c.eb(x % MOD), x = x / MOD; }
return c;
}
string to_string() {
if (dat.empty()) return "0";
string s;
for (int x: dat) {
FOR(LOG) {
s += '0' + (x % 10);
x = x / 10;
}
}
while (s.back() == '0') s.pop_back();
if (sgn == -1) s += '-';
reverse(all(s));
return s;
}
// https://codeforces.com/contest/504/problem/D
string to_binary_string() {
assert(sgn >= 0);
vc<u32> A(all(dat));
string ANS;
while (1) {
while (len(A) && A.back() == u32(0)) POP(A);
if (A.empty()) break;
u64 rem = 0;
FOR_R(i, len(A)) {
rem = rem * MOD + A[i];
A[i] = rem >> 32;
rem &= u32(-1);
}
FOR(i, 32) { ANS += '0' + (rem >> i & 1); }
}
while (len(ANS) && ANS.back() == '0') ANS.pop_back();
reverse(all(ANS));
if (ANS.empty()) ANS += '0';
return ANS;
}
// https://codeforces.com/contest/759/problem/E
pair<bint, int> divmod(int p) {
vc<int> after;
ll rm = 0;
FOR_R(i, len(dat)) {
rm = rm * MOD + dat[i];
after.eb(rm / p);
rm = rm % p;
}
reverse(all(after));
while (len(after) && after.back() == 0) POP(after);
bint q;
q.sgn = sgn;
q.dat = after;
rm *= sgn;
if (rm < 0) {
rm += p;
q -= 1;
}
return {q, rm};
}
// https://codeforces.com/problemset/problem/582/D
vc<int> base_p_representation(int p) {
vc<u32> A(all(dat));
vc<int> res;
while (1) {
while (len(A) && A.back() == u32(0)) POP(A);
if (A.empty()) break;
u64 rm = 0;
FOR_R(i, len(A)) {
rm = rm * MOD + A[i];
A[i] = rm / p;
rm %= p;
}
res.eb(rm);
}
reverse(all(res));
return res;
}
// overflow 無視して計算
ll to_ll() {
ll x = 0;
FOR_R(i, len(dat)) x = MOD * x + dat[i];
return sgn * x;
}
// https://codeforces.com/contest/986/problem/D
bint pow(ll n) {
assert(n >= 0);
auto dfs = [&](auto &dfs, ll n) -> bint {
if (n == 1) return (*this);
bint x = dfs(dfs, n / 2);
x *= x;
if (n & 1) x *= (*this);
return x;
};
if (n == 0) return bint(1);
return dfs(dfs, n);
}
// https://codeforces.com/contest/986/problem/D
double log10() {
assert(!dat.empty() && sgn == 1);
if (len(dat) <= 3) {
double x = 0;
FOR_R(i, len(dat)) x = MOD * x + dat[i];
return std::log10(x);
}
double x = 0;
FOR(i, 4) x = MOD * x + dat[len(dat) - 1 - i];
x = std::log10(x);
x += double(LOG) * (len(dat) - 4);
return x;
}
int digit_sum() {
int ans = 0;
for (auto &x: dat) ans += ::digit_sum(x); // global にある digit_sum
return ans;
}
};
#ifdef FASTIO
void wt(BigInteger x) { fastio::wt(x.to_string()); }
void rd(BigInteger &x) {
string s;
fastio::rd(s);
x = BigInteger(s);
}
#endif
#line 2 "library/geo/angle_sort.hpp"
#line 2 "library/geo/base.hpp"
template <typename T>
struct Point {
T x, y;
Point() : x(0), y(0) {}
template <typename A, typename B>
Point(A x, B y) : x(x), y(y) {}
template <typename A, typename B>
Point(pair<A, B> p) : x(p.fi), y(p.se) {}
Point operator+=(const Point p) {
x += p.x, y += p.y;
return *this;
}
Point operator-=(const Point p) {
x -= p.x, y -= p.y;
return *this;
}
Point operator+(Point p) const { return {x + p.x, y + p.y}; }
Point operator-(Point p) const { return {x - p.x, y - p.y}; }
bool operator==(Point p) const { return x == p.x && y == p.y; }
bool operator!=(Point p) const { return x != p.x || y != p.y; }
Point operator-() const { return {-x, -y}; }
Point operator*(T t) const { return {x * t, y * t}; }
Point operator/(T t) const { return {x / t, y / t}; }
bool operator<(Point p) const {
if (x != p.x) return x < p.x;
return y < p.y;
}
T dot(const Point& other) const { return x * other.x + y * other.y; }
T det(const Point& other) const { return x * other.y - y * other.x; }
double norm() { return sqrtl(x * x + y * y); }
double angle() { return atan2(y, x); }
Point rotate(double theta) {
static_assert(!is_integral<T>::value);
double c = cos(theta), s = sin(theta);
return Point{c * x - s * y, s * x + c * y};
}
Point rot90(bool ccw) { return (ccw ? Point{-y, x} : Point{y, -x}); }
};
#ifdef FASTIO
template <typename T>
void rd(Point<T>& p) {
fastio::rd(p.x), fastio::rd(p.y);
}
template <typename T>
void wt(Point<T>& p) {
fastio::wt(p.x);
fastio::wt(' ');
fastio::wt(p.y);
}
#endif
// A -> B -> C と進むときに、左に曲がるならば +1、右に曲がるならば -1
template <typename T>
int ccw(Point<T> A, Point<T> B, Point<T> C) {
T x = (B - A).det(C - A);
if (x > 0) return 1;
if (x < 0) return -1;
return 0;
}
template <typename REAL, typename T, typename U>
REAL dist(Point<T> A, Point<U> B) {
REAL dx = REAL(A.x) - REAL(B.x);
REAL dy = REAL(A.y) - REAL(B.y);
return sqrt(dx * dx + dy * dy);
}
// ax+by+c
template <typename T>
struct Line {
T a, b, c;
Line(T a, T b, T c) : a(a), b(b), c(c) {}
Line(Point<T> A, Point<T> B) { a = A.y - B.y, b = B.x - A.x, c = A.x * B.y - A.y * B.x; }
Line(T x1, T y1, T x2, T y2) : Line(Point<T>(x1, y1), Point<T>(x2, y2)) {}
template <typename U>
U eval(Point<U> P) {
return a * P.x + b * P.y + c;
}
template <typename U>
T eval(U x, U y) {
return a * x + b * y + c;
}
// 同じ直線が同じ a,b,c で表現されるようにする
void normalize() {
static_assert(is_same_v<T, int> || is_same_v<T, long long>);
T g = gcd(gcd(abs(a), abs(b)), abs(c));
a /= g, b /= g, c /= g;
if (b < 0) { a = -a, b = -b, c = -c; }
if (b == 0 && a < 0) { a = -a, b = -b, c = -c; }
}
bool is_parallel(Line other) { return a * other.b - b * other.a == 0; }
bool is_orthogonal(Line other) { return a * other.a + b * other.b == 0; }
};
template <typename T>
struct Segment {
Point<T> A, B;
Segment(Point<T> A, Point<T> B) : A(A), B(B) {}
Segment(T x1, T y1, T x2, T y2) : Segment(Point<T>(x1, y1), Point<T>(x2, y2)) {}
bool contain(Point<T> C) {
T det = (C - A).det(B - A);
if (det != 0) return 0;
return (C - A).dot(B - A) >= 0 && (C - B).dot(A - B) >= 0;
}
Line<T> to_Line() { return Line(A, B); }
};
template <typename REAL>
struct Circle {
Point<REAL> O;
REAL r;
Circle(Point<REAL> O, REAL r) : O(O), r(r) {}
Circle(REAL x, REAL y, REAL r) : O(x, y), r(r) {}
template <typename T>
bool contain(Point<T> p) {
REAL dx = p.x - O.x, dy = p.y - O.y;
return dx * dx + dy * dy <= r * r;
}
};
#line 4 "library/geo/angle_sort.hpp"
// lower: -1, origin: 0, upper: 1
template <typename T>
int lower_or_upper(const Point<T>& p) {
if (p.y != 0) return (p.y > 0 ? 1 : -1);
if (p.x > 0) return -1;
if (p.x < 0) return 1;
return 0;
}
// L<R:-1, L==R:0, L>R:1
template <typename T>
int angle_comp_3(const Point<T>& L, const Point<T>& R) {
int a = lower_or_upper(L), b = lower_or_upper(R);
if (a != b) return (a < b ? -1 : +1);
T det = L.det(R);
if (det > 0) return -1;
if (det < 0) return 1;
return 0;
}
// 偏角ソートに対する argsort
template <typename T>
vector<int> angle_sort(vector<Point<T>>& P) {
vc<int> I(len(P));
FOR(i, len(P)) I[i] = i;
sort(all(I), [&](auto& L, auto& R) -> bool { return angle_comp_3(P[L], P[R]) == -1; });
return I;
}
// 偏角ソートに対する argsort
template <typename T>
vector<int> angle_sort(vector<pair<T, T>>& P) {
vc<Point<T>> tmp(len(P));
FOR(i, len(P)) tmp[i] = Point<T>(P[i]);
return angle_sort<T>(tmp);
}
#line 1 "library/nt/rational.hpp"
template <typename T = long long, bool REDUCE = true>
struct Rational {
T num, den;
Rational() : num(0), den(1) {}
Rational(T x) : num(x), den(1) {}
Rational(T a, T b, bool coprime = false) : num(a), den(b) {
if (den < 0) num = -num, den = -den;
if (!coprime && REDUCE) reduce();
}
static T gcd(T a, T b) {
a = max(a, -a), b = max(b, -b);
while (b) {
a %= b;
swap(a, b);
}
return a;
}
void reduce() {
if constexpr (!REDUCE) {
return;
} else {
T g = gcd(num, den);
num /= g, den /= g;
}
}
Rational &operator+=(const Rational &p) {
if constexpr (!REDUCE) {
num = num * p.den + p.num * den;
den *= p.den;
return *this;
} else {
T g = (REDUCE ? gcd(den, p.den) : 1);
num = num * (p.den / g) + p.num * (den / g);
den *= p.den / g;
reduce();
return *this;
}
}
Rational &operator-=(const Rational &p) {
if constexpr (!REDUCE) {
num = num * p.den - p.num * den;
den *= p.den;
return *this;
} else {
T g = (REDUCE ? gcd(den, p.den) : 1);
num = num * (p.den / g) - p.num * (den / g);
den *= p.den / g;
reduce();
return *this;
}
}
Rational &operator*=(const Rational &p) {
if constexpr (!REDUCE) {
num = num * p.num;
den = den * p.den;
return *this;
} else {
T g1 = gcd(num, p.den);
T g2 = gcd(den, p.num);
num = (num / g1) * (p.num / g2);
den = (den / g2) * (p.den / g1);
return *this;
}
}
Rational &operator/=(const Rational &p) {
T g1 = (REDUCE ? gcd(num, p.num) : 1);
T g2 = (REDUCE ? gcd(den, p.den) : 1);
num = (num / g1) * (p.den / g2);
den = (den / g2) * (p.num / g1);
if (den < 0) num = -num, den = -den;
return *this;
}
Rational operator-() const { return Rational(-num, den); }
Rational operator+(const Rational &p) const { return Rational(*this) += p; }
Rational operator-(const Rational &p) const { return Rational(*this) -= p; }
Rational operator*(const Rational &p) const { return Rational(*this) *= p; }
Rational operator/(const Rational &p) const { return Rational(*this) /= p; }
bool operator==(const Rational &p) const { return num * p.den == p.num * den; }
bool operator!=(const Rational &p) const { return num * p.den != p.num * den; }
bool operator<(const Rational &p) const { return num * p.den < p.num * den; }
bool operator>(const Rational &p) const { return num * p.den > p.num * den; }
bool operator<=(const Rational &p) const { return num * p.den <= p.num * den; }
bool operator>=(const Rational &p) const { return num * p.den >= p.num * den; }
string to_string() { return std::to_string(num) + "/" + std::to_string(den); }
double to_double() { return double(num) / double(den); }
};
#line 7 "main.cpp"
using P = Point<ll>;
// using Q = Rational<BigInteger, false>;
using Q = Rational<i128, false>;
void solve() {
LL(N);
vc<string> name(N);
vc<P> point(N);
vi Z(N);
FOR(i, N) {
LL(x, y, z);
point[i] = {-y, x};
Z[i] = z;
read(name[i]);
}
{
vc<int> I(N);
FOR(i, N) I[i] = i;
sort(all(I), [&](auto &a, auto &b) -> bool {
int k = angle_comp_3(point[a], point[b]);
SHOW(point[a], point[b], k);
if (k == 1)
return true;
if (k == -1)
return false;
return Z[a] > Z[b];
});
name = rearrange(name, I);
point = rearrange(point, I);
Z = rearrange(Z, I);
}
vi X(N), Y(N);
FOR(i, N) X[i] = point[i].x;
FOR(i, N) Y[i] = point[i].y;
vc<string> ANS;
FOR(i, N) {
bool ok = 1;
FOR(j, N) {
if (i == j)
continue;
/*
円錐と線分が交わるかどうかという話になる
円錐
(x-X[j])^2+(y-Y[j])^2<=(z-Z[j])^2 ANS z<=Z[j]
線分
(tX[i],tY[i],tZ[i]), 0<=t<=1
t の 2 次関数 <= 0
0 <= t <= 1
at^2+bt+c<=0
*/
i128 a = 0, b = 0, c = 0;
a += X[i] * X[i];
b -= 2 * X[i] * X[j];
c += X[j] * X[j];
a += Y[i] * Y[i];
b -= 2 * Y[i] * Y[j];
c += Y[j] * Y[j];
a -= Z[i] * Z[i];
b += 2 * Z[i] * Z[j];
c -= Z[j] * Z[j];
auto check = [&](i128 num, i128 den) -> bool {
assert(den > 0);
// だめです
if (num < 0)
return 0;
if (num > den)
return 0;
if (num * Z[i] > den * Z[j])
return 0;
if (a * num * num + b * num * den + c * den * den > 0)
return false;
return true;
};
if (check(0, 1))
ok = 0;
if (check(1, 1))
ok = 0;
if (check(Z[j], Z[i]))
ok = 0;
if (check(-b, a + a))
ok = 0;
}
if (ok)
ANS.eb(name[i]);
}
for (auto &x : ANS)
print(x);
}
signed main() { solve(); }
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3720kb
input:
3 0 10000 8849 EVEREST 10000 0 5959 LOGAN 0 -10000 4808 BLANC
output:
EVEREST LOGAN BLANC
result:
ok 3 lines
Test #2:
score: 0
Accepted
time: 0ms
memory: 3676kb
input:
6 8 0 5 FUJI 9 1 5 MATTERHORN 9 0 5 KEBNEKAISE 9 -1 5 FAGRADALSFJALL 16 0 10 KILIMANJARO 120 0 80 DENALI
output:
MATTERHORN DENALI FUJI FAGRADALSFJALL
result:
ok 4 lines
Test #3:
score: 0
Accepted
time: 0ms
memory: 4008kb
input:
8 10 0 4 AX 0 10 4 AY -10 0 3 CX 0 -10 3 CY 6 0 2 BX -6 0 1 DX 0 6 2 BY 0 -6 1 DY
output:
AY BY AX BX CY DY CX DX
result:
ok 8 lines
Test #4:
score: 0
Accepted
time: 0ms
memory: 3724kb
input:
4 0 -6 1 D 0 6 2 B 0 -10 3 C 0 10 4 A
output:
A B C D
result:
ok 4 lines
Test #5:
score: 0
Accepted
time: 0ms
memory: 4000kb
input:
4 -6 0 1 D 6 0 2 B -10 0 3 C 10 0 4 A
output:
A B C D
result:
ok 4 lines
Test #6:
score: 0
Accepted
time: 0ms
memory: 3688kb
input:
13 9898 -1123 9898 AAA 4949 -2123 4949 BBB 4949 -6923 4949 CCC 2 1 2 A 2 2 2 B 2 3 2 C 2 4 2 D 2 5 2 E -9897 1123 9897 AA -9897 3123 9897 BB -9897 9896 9897 CC -9897 9897 9897 DD -9897 9898 9897 EE
output:
A AAA AA
result:
ok 3 lines
Test #7:
score: 0
Accepted
time: 0ms
memory: 3612kb
input:
1 -6214 -7904 6286 BAA
output:
BAA
result:
ok single line: 'BAA'
Test #8:
score: 0
Accepted
time: 0ms
memory: 3692kb
input:
2 1096 3048 441 BAA -8169 -9988 6030 BAB
output:
BAA BAB
result:
ok 2 lines
Test #9:
score: 0
Accepted
time: 0ms
memory: 3804kb
input:
3 8686 -148 7301 BAA 7862 -6596 3113 BAB -1427 -6616 3465 BAC
output:
BAA BAC
result:
ok 2 lines
Test #10:
score: 0
Accepted
time: 0ms
memory: 4052kb
input:
4 5979 -8461 1456 BAA 1440 3585 3436 BAB -8610 -7104 5215 BAC -1156 -5771 1016 BAD
output:
BAB BAA BAD BAC
result:
ok 4 lines
Test #11:
score: 0
Accepted
time: 0ms
memory: 3656kb
input:
10 -1870 -3207 978 BAA -5687 8014 1784 BAB 5641 -2094 1664 BAC -9329 -370 5729 BAD -1887 -7780 963 BAE -3798 -4239 1824 BAF -3023 1307 470 BAG 5421 -3149 1104 BAH 9705 -625 378 BAI 8583 6506 6659 BAJ
output:
BAJ BAI BAC BAH BAE BAA BAF BAD BAG BAB
result:
ok 10 lines
Test #12:
score: 0
Accepted
time: 0ms
memory: 3816kb
input:
50 -4890 -9660 3641 BAA -15 7023 3366 BAB -6231 321 4720 BAC 3729 -1491 2072 BAD -8401 4916 942 BAE -5336 -1429 3279 BAF 9563 -8527 4982 BAG 7742 -2885 5133 BAH -9514 -9395 8192 BAI 1832 -9090 841 BAJ 6730 -6402 4802 BBA -9950 -3694 5415 BBB -1354 5291 4809 BBC -8624 -1044 5060 BBD 5395 9638 4225 BB...
output:
BEC BDB BCF BAH BAD BBJ BBA BEA BBI BAF BAC BED BDF BBC
result:
ok 14 lines
Test #13:
score: 0
Accepted
time: 1ms
memory: 3784kb
input:
200 5263 -9472 6719 BAA 6564 54 2675 BAB 4524 -8632 5835 BAC 9485 -8357 2619 BAD -7800 -3613 2289 BAE 7804 6511 9011 BAF 1166 -3089 1714 BAG 5607 9945 8865 BAH -8889 -109 260 BAI 1473 9107 8314 BAJ 6376 -2235 1390 BBA 5189 8269 8993 BBB -2416 4304 4451 BBC -2394 6744 4038 BBD -7106 4475 4415 BBE -18...
output:
CEH BAJ BJA CJA BCE BFA CJE BHD CFG BAA BAC CHE CEG CAJ CAB CCE BDG BEE BHH CIA CCH CAD BBC BCF
result:
ok 24 lines
Test #14:
score: 0
Accepted
time: 4ms
memory: 3804kb
input:
500 -2000 -4403 3457 BAA -8075 -8578 619 BAB 8485 -6656 1821 BAC 9641 -746 1064 BAD -8573 248 2687 BAE -8080 6673 6056 BAF -1092 -7768 657 BAG 1244 9849 123 BAH 7702 -8473 2851 BAI 8455 6566 5978 BAJ 2866 -6101 820 BBA 5346 -2382 233 BBB 2943 2886 2770 BBC -5188 4666 5249 BBD -9026 1123 1740 BBE 287...
output:
ECH FBA BDB DFC FJC FEI FBJ BDH CBC CJA DGD EJH CAD CID BID EFA BBF CAE BGH BJA DJD DBD FIJ BAA CDJ EFI FCE DHC FAA FHB FAI CDI CBD CGF BEH CHJ EDH BCI EJE
result:
ok 39 lines
Test #15:
score: 0
Accepted
time: 15ms
memory: 4156kb
input:
999 9128 -2481 6086 BAA -2871 6747 5922 BAB -5883 6608 5302 BAC -2099 -6075 1525 BAD 3486 9110 4312 BAE -4395 9007 6773 BAF -7484 8891 5021 BAG -5288 -9473 4190 BAH -7997 -3467 6779 BAI 221 -5599 1063 BAJ 1846 -9335 2286 BBA 809 -3879 1050 BBB 8878 -9975 8177 BBC -7179 2532 6400 BBD -4865 6388 5563 ...
output:
GBA BAAB JHC BAIH ECD CJD HDJ BDH EHF IEF IEB BCG DAE BHC BJI GGJ DBJ BADJ BEF CAE DHD GHB ECE BAHG GJI IGA BAFG JJC IIF IJC EIB GCJ EGI CEE HGI JIG IHE JGF CEG CAG FIE EDD BADD BAHI IEE HCF FDB GBH BEE JJF DGH GIB BAHE EGD GGE JCH FIG EDJ EAH DHE EHH HAE HGD BAEJ BFJ
result:
ok 65 lines
Test #16:
score: 0
Accepted
time: 15ms
memory: 4184kb
input:
1000 2840 -1095 2563 BAA -2608 4560 4755 BAB -4019 -3659 3894 BAC 931 9419 5728 BAD -9923 -9959 9831 BAE 2146 -8981 1359 BAF -1456 309 1135 BAG -6016 8207 1692 BAH 8838 -60 7521 BAI 3037 -1111 2580 BAJ -73 8449 5735 BBA -683 6019 6050 BBB -9853 2512 3203 BBC -6502 -5807 6239 BBD 6811 8376 419 BBE -7...
output:
BIE IIG DFA EGI DIC DDE BADG HDD IDF DEA GEH IDA DHH FFC EBB BEH JAD BJE CHG GJD IGJ CID FHH BCA IIA BAGB JBB CCF CDJ HFE GIE DBB DDJ ECE JII DDI FHI CEF BBB HFC
result:
ok 40 lines
Test #17:
score: 0
Accepted
time: 0ms
memory: 3752kb
input:
1 5050 -4552 3409 BAA
output:
BAA
result:
ok single line: 'BAA'
Test #18:
score: 0
Accepted
time: 0ms
memory: 3716kb
input:
2 -5100 -7748 4632 BAA 760 -7202 3623 BAB
output:
BAB BAA
result:
ok 2 lines
Test #19:
score: 0
Accepted
time: 0ms
memory: 3952kb
input:
3 9932 3940 5348 BAA -8637 -9285 6341 BAB 5737 -2768 3175 BAC
output:
BAA BAC BAB
result:
ok 3 lines
Test #20:
score: 0
Accepted
time: 0ms
memory: 3804kb
input:
4 7225 8186 5454 BAA -5475 8632 5108 BAB -684 -28 333 BAC -3174 2761 2107 BAD
output:
BAA BAC BAD BAB
result:
ok 4 lines
Test #21:
score: 0
Accepted
time: 0ms
memory: 4024kb
input:
10 -624 -3704 1868 BAA 3242 3358 2342 BAB 3516 -5708 3360 BAC -3893 2054 2210 BAD -3007 8912 4702 BAE -4486 -7791 4490 BAF -9065 8912 6360 BAG 2268 -6141 3271 BAH -9542 192 4771 BAI -4146 -9735 5289 BAJ
output:
BAB BAC BAH BAA BAJ BAF BAI BAD BAG BAE
result:
ok 10 lines
Test #22:
score: 0
Accepted
time: 0ms
memory: 3852kb
input:
50 8893 -1969 4544 BAA -8520 5685 5123 BAB 5302 -4032 3320 BAC 8908 2744 4652 BAD 2556 -2237 1690 BAE 2321 -6087 3250 BAF 7986 6113 5035 BAG 5426 5564 3893 BAH -9188 -2365 4739 BAI -4162 1671 2236 BAJ -563 5865 2943 BBA 2660 3676 2266 BBB -900 -5488 2777 BBC -4558 -7210 4269 BBD -3282 1769 1869 BBE ...
output:
BDG BDB BCE BBB BAH BBF BAG BDE BCH BEA BAD BBJ BDF BAA BDA BBH BCF BAC BAE BDH BCJ BEJ BDC BAF BCC BCD BDD BEC BBC BDJ BBD BCG BBI BDI BBG BCB BEI BEB BAI BEF BAJ BCI BBE BAB BED BCA BEE BEG BEH BBA
result:
ok 50 lines
Test #23:
score: 0
Accepted
time: 1ms
memory: 3796kb
input:
200 6509 -9970 5960 BAA 8650 826 4339 BAB -8119 6144 5094 BAC 7105 -6209 4716 BAD 7612 4244 4366 BAE 8796 -2206 4543 BAF -3544 3991 2673 BAG 1630 7159 3676 BAH 1025 -9216 4636 BAI 2340 11 1174 BAJ -443 -8921 4465 BBA 7739 3969 4340 BBB -1414 1302 970 BBC 3818 -626 1931 BBD 1001 4349 2224 BBE 1914 50...
output:
CFJ BBJ CJD BJD BDC CIH BAH BBE BEE BBG BDB BEF CEF BEG BBF BGB CDF BHJ BFA CIC CBA BIJ CGD CCD CHD BFI BGG BFC BDJ BEB BDE BAE BBB BDG BDA CCJ CJB CAE BFE CGF BBH CIG BFB BAB CHF BAJ CAC CEB BGE BBD BAF BGF BFG CBF CAD CJJ CED CBE BJH BHA BHE CAI BFJ BJG CIB CBI BAD BCB CCB CGH CGE BCE BIF BHB CGC ...
result:
ok 196 lines
Test #24:
score: 0
Accepted
time: 4ms
memory: 3868kb
input:
500 -754 4803 2438 BAA 9842 1260 4957 BAB -5614 7810 4799 BAC -8650 932 4343 BAD 7364 7775 5346 BAE -3459 -8842 4746 BAF 6455 6858 4712 BAG -6482 -1748 3362 BAH -679 3589 1832 BAI -4768 -7874 4593 BAJ -6385 7985 5101 BBA 9402 2507 4859 BBB 8530 -3672 4640 BBC 3510 4332 2791 BBD -5304 7156 4446 BBE -...
output:
CJF BII EJC EEH EDF EEA CBB CFG FFH BFJ DIF EHA FCE CBF CCD EJD BIF FJF DIA FED FEJ BJI FCA CAH DAD DIE EEI BDB BIG CBH EAI DCE EAB EIH EJE EGA BHE DGE FBE DCD BEB BCH DCH BCI BGE EFD BBD FIG DJF FII BEH FCG FAE BAG BAE CDI DDH EJF CAG EHC BBH CCJ FCI FHJ DGB EGB EJB BFA FGA BGI FBJ CJD FBD FIC BDD ...
result:
ok 472 lines
Test #25:
score: 0
Accepted
time: 15ms
memory: 3960kb
input:
999 -9627 6725 5864 BAA 8319 9533 6329 BAB -406 -1944 1001 BAC 6995 9031 5717 BAD -3219 -4202 2642 BAE 4069 -356 2050 BAF 189 -4833 2421 BAG 2514 -9243 4790 BAH -2634 6981 3728 BAI -5639 -349 2820 BAJ -1273 -2111 1224 BBA 3416 3024 2275 BBB -3433 -1454 1863 BBC 152 6203 3094 BBD -9092 -2453 4700 BBE...
output:
BAFC IAI FJD JJE DDB BBD CBE BIC JFJ BADI CAF DDE DBE JBJ JDB BAAB FEG ICG FAE CEH HAH BEB JHI BAGB CAA FAH CJF BAGF IBA BGI JED GGF DDH BEG FGJ CDC HID FAB HAA GJE FFC GJA JCG CFC BAIA IJC FEC GGJ BAEC EEJ BFA CGJ GEC DAI EEA HDA CIJ EHI DJC HGJ FIB BIA BJA BAAG ICA BAHD HIC JGH BABJ FBA GHF BDD GI...
result:
ok 894 lines
Test #26:
score: 0
Accepted
time: 15ms
memory: 4144kb
input:
1000 3111 -7232 3927 BAA 6651 -4443 4000 BAB -3734 -8456 4628 BAC 8276 1329 4199 BAD -3729 -1010 1929 BAE -4707 -2625 2703 BAF -1687 -5882 3055 BAG 2199 364 1124 BAH 7674 -9474 6104 BAI -8668 -7683 5796 BAJ -7980 -7148 5354 BBA 6354 -3413 3603 BBB 8565 -6511 5386 BBC 4868 1011 2494 BBD -2639 -630 13...
output:
HHD CIB GFH BABE DHG JAA BAAA EGD ICJ IDJ DII DHE HAB DJE EJJ HIG BDC FIF JJC CIC FGC EBJ CFA HCG JJJ DJB JEB BIG JDF BFE BBH EDB EGB BEH IGB ICH JEC DEB FFE DAB GGC BHH IBD FIA IBI DHJ IEC JFJ CEI IDI HJG EII FJI GFC GID CGI BAFA IJJ FGF CFB BABB DBE GHD GDH DIG GAE BAGI FIC IGJ DHI DJH JAC BAIC EA...
result:
ok 903 lines
Test #27:
score: 0
Accepted
time: 0ms
memory: 3656kb
input:
1 5479 44 2739 BAA
output:
BAA
result:
ok single line: 'BAA'
Test #28:
score: 0
Accepted
time: 0ms
memory: 4020kb
input:
2 9802 27 4898 BAA 3484 18 1739 BAB
output:
BAB BAA
result:
ok 2 lines
Test #29:
score: 0
Accepted
time: 0ms
memory: 3720kb
input:
3 3091 -25 1545 BAA 2824 13 1412 BAB 4276 27 2136 BAC
output:
BAC BAB BAA
result:
ok 3 lines
Test #30:
score: 0
Accepted
time: 0ms
memory: 3692kb
input:
4 2667 8 1329 BAA 1302 6 647 BAB 4468 -33 2234 BAC 6951 12 3474 BAD
output:
BAB BAA BAD BAC
result:
ok 4 lines
Test #31:
score: 0
Accepted
time: 0ms
memory: 3680kb
input:
10 3418 -26 1706 BAA 724 -6 359 BAB 3631 -4 1815 BAC 1189 -3 594 BAD 3392 24 1692 BAE 1975 4 983 BAF 456 3 224 BAG 3943 19 1970 BAH 4089 -16 2040 BAI 1611 -11 805 BAJ
output:
BAE BAG BAH BAF BAC BAD BAI BAJ BAA BAB
result:
ok 10 lines
Test #32:
score: 0
Accepted
time: 0ms
memory: 3976kb
input:
50 5102 -27 2551 BAA 1320 -10 660 BAB 5057 -8 2528 BAC 109 -1 50 BAD 1799 -11 896 BAE 3885 -5 1941 BAF 6860 -58 3427 BAG 1931 1 964 BAH 1474 -12 734 BAI 2873 -23 1433 BAJ 975 5 485 BBA 149 0 73 BBB 1432 -4 713 BBC 8788 -37 4391 BBD 5494 -48 2745 BBE 702 -2 348 BBF 1679 -8 835 BBG 1160 -3 577 BBH 645...
output:
BDI BCB BDE BBI BCE BCI BCH BCG BCJ BEF BEJ BEC BEB BEE BBB BDG BAF BEI BAC BDH BCF BBH BBC BBF BCD BBJ BBD BDJ BAA BAB BAG BEH BBE BAD
result:
ok 34 lines
Test #33:
score: 0
Accepted
time: 1ms
memory: 3824kb
input:
200 4921 -27 2458 BAA 4526 -37 2262 BAB 827 -4 409 BAC 3036 -21 1516 BAD 1595 11 794 BAE 299 2 148 BAF 1032 -3 516 BAG 5140 46 2567 BAH 3398 16 1695 BAI 1366 1 683 BAJ 3496 12 1747 BBA 1486 -8 741 BBB 1380 -10 689 BBC 1168 -10 582 BBD 4631 -34 2314 BBE 4825 -31 2408 BBF 221 1 109 BBG 2507 -2 1250 BB...
output:
CAE BCJ CDB BFI BIE BDF CDJ CGE CCD CCF CBE CBA CHJ BHD BAF CDE BGJ BHH BGC BBG CDI CCA CJG CGG BFA BHA CID CGA CJF CFG BFC BDA CBF CEH CIG CFA CIA BAJ BDG BCI CEF BJA BIB CGB CIF CAB BJF CFD BIH BAG BHG BJE CGJ BFB BBI BED BEJ BAA CCB CHA CIB BDD CCH BJG BCG BGH BBC CAA CAJ BAB CIE CHG CJA BFE BBD ...
result:
ok 81 lines
Test #34:
score: 0
Accepted
time: 4ms
memory: 3788kb
input:
500 7951 -47 3973 BAA 1872 5 935 BAB 5349 -29 2672 BAC 2351 23 1172 BAD 3367 7 1680 BAE 156 -1 74 BAF 1416 -6 708 BAG 782 4 387 BAH 1781 10 887 BAI 647 4 320 BAJ 1691 15 845 BBA 5334 49 2667 BBB 2959 20 1475 BBC 2830 -1 1411 BBD 1066 1 533 BBE 4110 15 2053 BBF 298 -2 145 BBG 1372 3 686 BBH 7070 70 3...
output:
CJB DGJ BII BBB BBA DHF FBI BCD FEB FCH DCJ EBB DFE BFE DEB BFF CGJ EGH DJD EBC DJB BDH DEA EFG FJF DFJ FFD FGH FDH BFC BCB CGI FEE DEH CGB CJE BHG CEJ EGB EGE BBH FJE FAF EAJ FAE CCH BBE BIH FGE DBG EDJ DBD CFF CBG FGD FHA FDA EBI CGC EBJ EAE EDH DDG DGF EJD CHJ EDD EAG BBJ BEF DEE BAG BCF BFG DIA ...
result:
ok 111 lines
Test #35:
score: 0
Accepted
time: 15ms
memory: 3840kb
input:
999 2641 -8 1319 BAA 5039 23 2519 BAB 3988 -34 1992 BAC 627 -5 310 BAD 3695 -7 1845 BAE 1533 -11 764 BAF 3786 -8 1891 BAG 8817 28 4404 BAH 7697 -43 3844 BAI 5680 47 2836 BAJ 8631 51 4312 BBA 5256 34 2624 BBB 2880 5 1438 BBC 1385 13 690 BBD 1411 14 705 BBE 3963 9 1978 BBF 6082 46 3038 BBG 8108 -59 40...
output:
JGE IEC JGD BBJ DAE DCJ BAJG JAF HAC HCB IAG EAH BJG FDF IJB DGI FFG DHG JDH FAD DBD DBJ FEJ CAE FBF FAJ IHF HJG GFF CGF GCF EGF HFI JCG JDI DGJ CBJ HJD HEA CDC BAAC HEJ CHC EIG BAB GED DJF DCD FGH HDE EJH FJD EIF IIA BIF GCI JJF CEA FHF JCH CFI BAAB BACA DDD BIJ BFC FCE DCI BFG BAFF CJC JAE BFJ EJD...
result:
ok 178 lines
Test #36:
score: 0
Accepted
time: 15ms
memory: 3848kb
input:
1000 8487 56 4239 BAA 2861 22 1430 BAB 2827 17 1410 BAC 3140 29 1566 BAD 8158 -50 4076 BAE 2855 22 1425 BAF 9638 -25 4815 BAG 326 1 162 BAH 5532 -11 2764 BAI 4749 8 2373 BAJ 5203 49 2600 BBA 5762 24 2877 BBB 2381 8 1189 BBC 1662 -16 827 BBD 1295 4 646 BBE 2785 8 1391 BBF 7987 -23 3991 BBG 331 0 161 ...
output:
HGJ FEI IAE BABG FJA IHG CED CGB BAEI BAJH CIB GAD HJC BAGJ HID BHB JCG JDE BAB JEE BAIF CJI CGJ CJB CJC DAC IDJ BADG GGC BAAE GDC BCE GJG IFB HDA DIA FBI BAIA FEB EBH GGD HBE CJD HCE IGF GAA DBJ CBI CAE HIA CAJ FHF GGA CDE HHJ EHG DCG HJG FDJ EFF EEI BAGF BDG DJJ IGE GDH BAHD HJJ DHD EAH CDA DBE FC...
result:
ok 165 lines
Test #37:
score: 0
Accepted
time: 0ms
memory: 3676kb
input:
1 999 999 999 BAA
output:
BAA
result:
ok single line: 'BAA'
Test #38:
score: 0
Accepted
time: 0ms
memory: 3996kb
input:
2 999 999 999 BAA 1281 9063 1283 BAB
output:
BAB BAA
result:
ok 2 lines
Test #39:
score: 0
Accepted
time: 0ms
memory: 3732kb
input:
3 999 999 999 BAA 8531 6979 6982 BAB 9670 2487 2488 BAC
output:
BAA BAB
result:
ok 2 lines
Test #40:
score: 0
Accepted
time: 0ms
memory: 3780kb
input:
4 999 999 999 BAA 8782 7663 7665 BAB 9897 2435 2434 BAC 9207 5458 5457 BAD
output:
BAA BAB
result:
ok 2 lines
Test #41:
score: 0
Accepted
time: 0ms
memory: 3760kb
input:
10 999 999 999 BAA 9896 7064 7064 BAB 9213 7143 7144 BAC 8765 5479 5481 BAD 5892 9290 5891 BAE 8601 7789 7790 BAF 1391 8786 1392 BAG 9821 3746 3747 BAH 8707 6956 6958 BAI 8473 4006 4006 BAJ
output:
BAG BAA BAF BAI
result:
ok 4 lines
Test #42:
score: 0
Accepted
time: 0ms
memory: 4024kb
input:
50 999 999 999 BAA 9440 907 909 BAB 8116 2741 2743 BAC 8183 7520 7520 BAD 8425 3602 3605 BAE 9133 3982 3983 BAF 8146 7565 7566 BAG 8813 6720 6719 BAH 9194 4252 4253 BAI 2634 8933 2637 BAJ 8809 5558 5558 BBA 8314 4401 4402 BBB 5262 9994 5262 BBC 8526 6905 6908 BBD 8855 5162 5162 BBE 6062 8027 6065 BB...
output:
BBF BAA BAG BBI BBD BBG BDF BAE
result:
ok 8 lines
Test #43:
score: 0
Accepted
time: 0ms
memory: 3844kb
input:
200 999 999 999 BAA 9726 2910 2911 BAB 8272 1860 1859 BAC 8771 2153 2154 BAD 9189 614 613 BAE 9778 5934 5935 BAF 9617 6340 6341 BAG 9851 1517 1519 BAH 2519 8648 2519 BAI 8829 6940 6940 BAJ 6643 9743 6644 BBA 9355 2527 2528 BBB 8913 7439 7441 BBC 9343 3499 3499 BBD 5579 9807 5580 BBE 8873 1985 1988 B...
output:
BEB CEJ BEF CBG BFJ CJB CIH BDI BAA BJE BBC BGJ CGA BJG BIC CHE CBB BDD CHH BCE BIF
result:
ok 21 lines
Test #44:
score: 0
Accepted
time: 4ms
memory: 3784kb
input:
500 999 999 999 BAA 9561 2476 2479 BAB 9185 2386 2389 BAC 9902 1888 1891 BAD 9958 9500 9503 BAE 8399 5475 5474 BAF 8101 5389 5392 BAG 8650 698 700 BAH 9289 5452 5454 BAI 9390 7755 7755 BAJ 6765 8482 6764 BBA 8010 7104 7105 BBB 8746 3297 3296 BBC 9501 4327 4330 BBD 9258 7821 7821 BBE 8062 6298 6299 B...
output:
CBG CEC BHD BJC CIA DEI BBI CEF DBF FFD BAA BAE BDJ BBB EDA DIG CBC EBD FHD CBH BAG EEE CGD DBE CAE
result:
ok 25 lines
Test #45:
score: 0
Accepted
time: 16ms
memory: 3832kb
input:
999 999 999 999 BAA 8542 5797 5797 BAB 8042 5238 5239 BAC 8302 6705 6705 BAD 9303 2740 2739 BAE 8594 1212 1212 BAF 9541 1997 1996 BAG 9059 6750 6752 BAH 9733 7777 7777 BAI 3145 9626 3146 BAJ 9373 2375 2376 BBA 9467 9185 9184 BBB 7467 8593 7468 BBC 8321 1398 1399 BBD 3399 8187 3399 BBE 8362 1321 1322...
output:
JAB EBF BFC HBG EEG BFA IJG CJI IGD HEA CHJ BBC BAA DCB EEJ DCD BAH IBB DAJ BGD DFI CDD JCC DAI BCI BAJA BHD EIG DIG CCF EDD FGB HGA
result:
ok 33 lines
Test #46:
score: 0
Accepted
time: 16ms
memory: 4132kb
input:
1000 999 999 999 BAA 9879 737 740 BAB 8483 688 691 BAC 8175 1181 1183 BAD 9864 6657 6660 BAE 8362 6049 6049 BAF 9576 4382 4381 BAG 9034 1136 1139 BAH 8714 7441 7442 BAI 9476 4434 4437 BAJ 8375 1408 1410 BBA 9226 4820 4823 BBB 1841 9968 1843 BBC 9998 6462 6461 BBD 8816 5920 5921 BBE 8583 5795 5796 BB...
output:
JIF JHD IDH BIH HGF CGI JIG DBG BAA EFH FJA BGB CCJ EEH IJE BAFD GDG EAJ BFB IEE IAD EGA BHF IBH
result:
ok 24 lines