QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#709274 | #9542. Friendship is Magic | ucup-team087 | AC ✓ | 455ms | 19440kb | C++23 | 39.2kb | 2024-11-04 13:36:17 | 2024-11-04 13:36:19 |
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_mod_2(int x) { return __builtin_parity(x); }
int popcnt_mod_2(u32 x) { return __builtin_parity(x); }
int popcnt_mod_2(ll x) { return __builtin_parityll(x); }
int popcnt_mod_2(u64 x) { return __builtin_parityll(x); }
// (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 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); }
#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) {
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/geo/convex_hull.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/convex_hull.hpp"
// allow_180=true で同一座標点があるとこわれる
// full なら I[0] が sorted で min になる
template <typename T, bool allow_180 = false>
vector<int> ConvexHull(vector<Point<T>>& XY, string mode = "full", bool sorted = false) {
assert(mode == "full" || mode == "lower" || mode == "upper");
ll N = XY.size();
if (N == 1) return {0};
if (N == 2) {
if (XY[0] < XY[1]) return {0, 1};
if (XY[1] < XY[0]) return {1, 0};
return {0};
}
vc<int> I(N);
if (sorted) {
FOR(i, N) I[i] = i;
} else {
I = argsort(XY);
}
if constexpr (allow_180) { FOR(i, N - 1) assert(XY[i] != XY[i + 1]); }
auto check = [&](ll i, ll j, ll k) -> bool {
T det = (XY[j] - XY[i]).det(XY[k] - XY[i]);
if constexpr (allow_180) return det >= 0;
return det > T(0);
};
auto calc = [&]() {
vector<int> P;
for (auto&& k: I) {
while (P.size() > 1) {
auto i = P[P.size() - 2];
auto j = P[P.size() - 1];
if (check(i, j, k)) break;
P.pop_back();
}
P.eb(k);
}
return P;
};
vc<int> P;
if (mode == "full" || mode == "lower") {
vc<int> Q = calc();
P.insert(P.end(), all(Q));
}
if (mode == "full" || mode == "upper") {
if (!P.empty()) P.pop_back();
reverse(all(I));
vc<int> Q = calc();
P.insert(P.end(), all(Q));
}
if (mode == "upper") reverse(all(P));
while (len(P) >= 2 && XY[P[0]] == XY[P.back()]) P.pop_back();
return P;
}
#line 2 "library/convex/line_min_function.hpp"
// 1 次関数の max を [L,R,a,b] の列として出力
// https://qoj.ac/contest/1576/problem/8505
template <typename Re, typename T>
vc<tuple<Re, Re, Re, Re>> line_min_function_real(vc<pair<T, T>> LINE) {
assert(!LINE.empty());
using P = Point<T>;
vc<P> point;
for (auto& [x, y]: LINE) point.eb(P(x, y));
auto I = ConvexHull(point, "lower");
point = rearrange(point, I);
int N = len(point);
if (N >= 2 && point[N - 1].x == point[N - 2].x) { POP(point), --N; }
reverse(all(point)); // 傾きは大きい方から
Re l = -infty<Re>;
vc<tuple<Re, Re, Re, Re>> ANS;
FOR(i, N) {
Re r = infty<Re>;
auto [a, b] = point[i];
if (i + 1 < N) {
auto [c, d] = point[i + 1];
if (a == c) continue;
assert(a > c);
r = Re(d - b) / (a - c);
chmax(r, l), chmin(r, infty<Re>);
}
if (l < r) ANS.eb(l, r, a, b), l = r;
}
return ANS;
}
// 1 次関数の max を [L,R,a,b] の列として出力
template <typename Re, typename T>
vc<tuple<Re, Re, Re, Re>> line_max_function_real(vc<pair<T, T>> LINE) {
assert(!LINE.empty());
for (auto& [a, b]: LINE) a = -a, b = -b;
auto ANS = line_min_function_real<Re, T>(LINE);
for (auto& [l, r, a, b]: ANS) a = -a, b = -b;
return ANS;
}
// LINE(a,b,c): y=(ax+b)/c, 評価点は整数
// 1 次関数の min を [L,R,a,b,c] の列として出力
// c>0, (ax+b)c がオーバーフローしない,
template <typename T>
vc<tuple<T, T, T, T, T>> line_min_function_rational(vc<tuple<T, T, T>> LINE, T L, T R) {
// 傾き降順
sort(all(LINE), [&](auto& L, auto& R) -> bool {
auto& [a1, b1, c1] = L;
auto& [a2, b2, c2] = R;
return a1 * c2 > a2 * c1;
});
vc<tuple<T, T, T, T, T>> ANS;
for (auto& [a2, b2, c2]: LINE) {
while (1) {
if (ANS.empty()) {
ANS.eb(L, R, a2, b2, c2);
break;
}
auto& [L1, R1, a1, b1, c1] = ANS.back();
if ((a1 * L1 + b1) * c2 > (a2 * L1 + b2) * c1) {
ANS.pop_back();
if (len(ANS)) get<1>(ANS.back()) = R;
continue;
}
T s = c2 * a1 - a2 * c1;
if (s == 0) break;
assert(s > 0);
T t = b2 * c1 - b1 * c2;
T x = t / s;
assert(L1 <= x);
if (x >= R1 - 1) break;
R1 = x + 1;
ANS.eb(x + 1, R, a2, b2, c2);
}
}
return ANS;
}
// LINE(a,b,c): y=(ax+b)/c, 評価点は整数
// 1 次関数の min を [L,R,a,b,c] の列として出力
// c>0, (ax+b)c がオーバーフローしない,
template <typename T>
vc<tuple<T, T, T, T, T>> line_max_function_rational(vc<tuple<T, T, T>> LINE, T L, T R) {
for (auto& [a, b, c]: LINE) a = -a, b = -b;
auto ANS = line_min_function_rational<T>(LINE, L, R);
for (auto& [L, R, a, b, c]: ANS) a = -a, b = -b;
return ANS;
}
// LINE(a,b): y=ax+b, 評価点は整数
// 1 次関数の min を [L,R,a,b] の列として出力
// ax+b がオーバーフローしない,
template <typename T>
vc<tuple<T, T, T, T>> line_min_function_integer(vc<pair<T, T>> LINE, T L, T R) {
// 傾き降順
sort(all(LINE), [&](auto& L, auto& R) -> bool {
auto& [a1, b1] = L;
auto& [a2, b2] = R;
return a1 > a2;
});
vc<tuple<T, T, T, T>> ANS;
for (auto& [a2, b2]: LINE) {
while (1) {
if (ANS.empty()) {
ANS.eb(L, R, a2, b2);
break;
}
auto& [L1, R1, a1, b1] = ANS.back();
if ((a1 * L1 + b1) > (a2 * L1 + b2)) {
ANS.pop_back();
if (len(ANS)) get<1>(ANS.back()) = R;
continue;
}
T s = a1 - a2;
if (s == 0) break;
assert(s > 0);
T t = b2 - b1;
T x = t / s;
assert(L1 <= x);
if (x >= R1 - 1) break;
R1 = x + 1;
ANS.eb(x + 1, R, a2, b2);
}
}
return ANS;
}
// LINE(a,b,c): y=(ax+b)/c, 評価点は整数
// 1 次関数の min を [L,R,a,b,c] の列として出力
// c>0, (ax+b)c がオーバーフローしない,
template <typename T>
vc<tuple<T, T, T, T>> line_max_function_integer(vc<pair<T, T>> LINE, T L, T R) {
for (auto& [a, b]: LINE) a = -a, b = -b;
auto ANS = line_min_function_integer<T>(LINE, L, R);
for (auto& [L, R, a, b]: ANS) a = -a, b = -b;
return ANS;
}
#line 1 "library/mod/floor_sum_of_linear_polynomial.hpp"
#line 2 "library/alg/monoid_pow.hpp"
// chat gpt
template <typename U, typename Arg1, typename Arg2>
struct has_power_method {
private:
// ヘルパー関数の実装
template <typename V, typename A1, typename A2>
static auto check(int)
-> decltype(std::declval<V>().power(std::declval<A1>(),
std::declval<A2>()),
std::true_type{});
template <typename, typename, typename>
static auto check(...) -> std::false_type;
public:
// メソッドの有無を表す型
static constexpr bool value = decltype(check<U, Arg1, Arg2>(0))::value;
};
template <typename Monoid>
typename Monoid::X monoid_pow(typename Monoid::X x, ll exp) {
using X = typename Monoid::X;
if constexpr (has_power_method<Monoid, X, ll>::value) {
return Monoid::power(x, exp);
} else {
assert(exp >= 0);
X res = Monoid::unit();
while (exp) {
if (exp & 1) res = Monoid::op(res, x);
x = Monoid::op(x, x);
exp >>= 1;
}
return res;
}
}
#line 2 "library/mod/floor_monoid_product.hpp"
// https://yukicoder.me/submissions/883884
// https://qoj.ac/contest/1411/problem/7620
// U は範囲内で ax+b がオーバーフローしない程度
// yyy x yyyy x ... yyy x yyy (x を N 個)
// k 個目の x までに floor(ak+b,m) 個の y がある
// my<=ax+b における lattice path における辺の列と見なせる
template <typename Monoid, typename X, typename U>
X floor_monoid_product(X x, X y, U N, U a, U b, U m) {
U c = (a * N + b) / m;
X pre = Monoid::unit(), suf = Monoid::unit();
while (1) {
const U p = a / m, q = b / m;
a %= m, b %= m;
x = Monoid::op(x, monoid_pow<Monoid>(y, p));
pre = Monoid::op(pre, monoid_pow<Monoid>(y, q));
c -= (p * N + q);
if (c == 0) break;
const U d = (m * c - b - 1) / a + 1;
suf = Monoid::op(y, Monoid::op(monoid_pow<Monoid>(x, N - d), suf));
b = m - b - 1 + a, N = c - 1, c = d;
swap(m, a), swap(x, y);
}
x = monoid_pow<Monoid>(x, N);
return Monoid::op(Monoid::op(pre, x), suf);
}
#line 1 "library/alg/monoid/monoid_for_floor_sum.hpp"
// sum i^k1floor^k2: floor path で (x,y) から x 方向に進むときに x^k1y^k2 を足す
template <typename T, int K1, int K2>
struct Monoid_for_floor_sum {
using ARR = array<array<T, K2 + 1>, K1 + 1>;
struct Data {
ARR dp;
T dx, dy;
};
using value_type = Data;
using X = value_type;
static X op(X a, X b) {
static constexpr int n = max(K1, K2);
static T comb[n + 1][n + 1];
if (comb[0][0] != T(1)) {
comb[0][0] = T(1);
FOR(i, n) FOR(j, i + 1) { comb[i + 1][j] += comb[i][j], comb[i + 1][j + 1] += comb[i][j]; }
}
array<T, K1 + 1> pow_x;
array<T, K2 + 1> pow_y;
pow_x[0] = 1, pow_y[0] = 1;
FOR(i, K1) pow_x[i + 1] = pow_x[i] * a.dx;
FOR(i, K2) pow_y[i + 1] = pow_y[i] * a.dy;
// +dy
FOR(i, K1 + 1) {
FOR_R(j, K2 + 1) {
T x = b.dp[i][j];
FOR(k, j + 1, K2 + 1) b.dp[i][k] += comb[k][j] * pow_y[k - j] * x;
}
}
// +dx
FOR(j, K2 + 1) {
FOR_R(i, K1 + 1) { FOR(k, i, K1 + 1) a.dp[k][j] += comb[k][i] * pow_x[k - i] * b.dp[i][j]; }
}
a.dx += b.dx, a.dy += b.dy;
return a;
}
static X to_x() {
X x = unit();
x.dp[0][0] = 1, x.dx = 1;
return x;
}
static X to_y() {
X x = unit();
x.dy = 1;
return x;
}
static constexpr X unit() { return {ARR{}, T(0), T(0)}; }
static constexpr bool commute = 0;
};
#line 4 "library/mod/floor_sum_of_linear_polynomial.hpp"
// 全部非負, T は答, U は ax+b がオーバーフローしない
template <typename T, int K1, int K2, typename U>
array<array<T, K2 + 1>, K1 + 1> floor_sum_of_linear_polynomial_nonnegative(U N, U a, U b, U mod) {
static_assert(is_same_v<U, u64> || is_same_v<U, u128>);
assert(a == 0 || N < (U(-1) - b) / a);
using Mono = Monoid_for_floor_sum<T, K1, K2>;
auto x = floor_monoid_product<Mono>(Mono::to_x(), Mono::to_y(), N, a, b, mod);
return x.dp;
};
// sum_{L<=x<R} x^i floor(ax+b,mod)^j
// a+bx が I, U でオーバーフローしない
template <typename T, int K1, int K2, typename I>
array<array<T, K2 + 1>, K1 + 1> floor_sum_of_linear_polynomial(I L, I R, I a, I b, I mod) {
static_assert(is_same_v<I, ll> || is_same_v<I, i128>);
assert(L <= R && mod > 0);
if (a < 0) {
auto ANS = floor_sum_of_linear_polynomial<T, K1, K2, I>(-R + 1, -L + 1, -a, b, mod);
FOR(i, K1 + 1) {
if (i % 2 == 1) { FOR(j, K2 + 1) ANS[i][j] = -ANS[i][j]; }
}
return ANS;
}
assert(a >= 0);
I ADD_X = L;
I N = R - L;
b += a * L;
I ADD_Y = floor<I>(b, mod);
b -= ADD_Y * mod;
assert(a >= 0 && b >= 0);
using Mono = Monoid_for_floor_sum<T, K1, K2>;
using Data = typename Mono::Data;
using U = std::conditional_t<is_same_v<I, ll>, i128, u128>;
Data A = floor_monoid_product<Mono, Data, U>(Mono::to_x(), Mono::to_y(), N, a, b, mod);
Data offset = Mono::unit();
offset.dx = T(ADD_X), offset.dy = T(ADD_Y);
A = Mono::op(offset, A);
return A.dp;
};
#line 7 "main.cpp"
using mint = modint107;
ll f(ll n) {
string S = to_string(n);
ll ANS = n;
FOR(k, len(S) + 1) {
ll a = (k == 0 ? 0 : stoi(S.substr(0, k)));
ll b = (k == len(S) ? 0 : stoi(S.substr(k)));
chmin(ANS, abs(a - b));
}
return ANS;
}
ll ten[20];
// 右側の桁数 r
// L, 10^rM, R
// concat(L,M)>R
// L<=concat(M,R)
mint F2(ll r, ll M, ll L1, ll L2, ll R1, ll R2) {
SHOW(r, M, L1, L2, R1, R2);
using T6 = tuple<ll, ll, ll, ll, ll, ll>;
static map<T6, mint> MP;
T6 key = {r, M, L1, L2, R1, R2};
if (MP.count(key)) return MP[key];
assert(L1 <= L2 && R1 <= R2);
if (L1 == L2 || R1 == R2) return 0;
if (L1 >= M * ten[r] + R2) return 0;
mint ANS = 0;
// FOR(L, L1, L2) {
// FOR(R, R1, R2) {
// if (10 * L + M > R && L <= ten[r] * M + R) {
// ll a = 10 * L + M - R;
// ll b = ten[r] * M + R - L;
// ANS += min(a, b);
// }
// }
// }
// return ANS;
using T3 = tuple<i128, i128, i128>;
auto sub = [&](vc<T3> lower, vc<T3> upper, mint A, mint B, mint C) -> void {
vc<tuple<i128, i128, i128, i128, i128>> LO = line_max_function_rational<i128>(lower, L1, L2);
vc<tuple<i128, i128, i128, i128, i128>> HI = line_min_function_rational<i128>(upper, L1, L2);
reverse(all(LO));
reverse(all(HI));
B *= inv<mint>(2);
auto calc = [&](ll L, ll R, ll a, ll b, ll c) -> mint {
mint ans = 0;
if (R == L + 1) {
ll x = L;
ll y = floor<ll>(a * x + b, c);
ans += A * x * (y + 1);
ans += B * y * (y + 1);
ans += C * (y + 1);
return ans;
}
// FOR(x, L, R) {
// ll y = floor<ll>(a * x + b, c);
// ans += A * x * (y + 1);
// ans += B * inv<mint>(2) * y * (y + 1);
// ans += C * (y + 1);
// }
auto S = floor_sum_of_linear_polynomial<mint, 1, 2, i128>(L, R, a, b, c);
ans += A * (S[1][0] + S[1][1]);
ans += B * (S[0][1] + S[0][2]);
ans += C * (S[0][0] + S[0][1]);
return ans;
};
auto f = [&](ll L, ll R, ll a1, ll b1, ll c1, ll a2, ll b2, ll c2) -> void {
if (L == R) return;
ANS += calc(L, R, a2, b2 - 1, c2) - calc(L, R, a1, b1 - 1, c1);
// FOR(x, L, R) {
// ll s = floor<ll>(a1 * x + b1 - 1, c1);
// ll t = floor<ll>(a2 * x + b2 - 1, c2);
// FOR(y, s + 1, t + 1) { ANS += A * x + B * y + C; }
// }
};
auto g = [&](ll L, ll R, ll a1, ll b1, ll c1, ll a2, ll b2, ll c2) -> void {
ll d = (a1 * c2 - a2 * c1);
if (d == 0) {
f(L, R, a1, b1, c1, a2, b2, c2);
} else {
ll x = floor<ll>(b2 * c1 - b1 * c2, a1 * c2 - a2 * c1);
if (d > 0) {
if (x < L) { return; }
chmin(x, R - 1);
f(L, x + 1, a1, b1, c1, a2, b2, c2);
} else {
if (R <= x) { return; }
chmax(x, L - 1);
f(x + 1, R, a1, b1, c1, a2, b2, c2);
}
}
};
while (len(LO) && len(HI)) {
auto& [L1, R1, a1, b1, c1] = LO.back();
auto& [L2, R2, a2, b2, c2] = HI.back();
assert(L1 == L2);
ll R = min(R1, R2);
g(L1, R, a1, b1, c1, a2, b2, c2);
L1 = R, L2 = R;
if (L1 == R1) POP(LO);
if (L2 == R2) POP(HI);
}
};
{
vc<T3> lower, upper;
lower.eb(0, R1, 1);
upper.eb(0, R2, 1);
lower.eb(1, -ten[r] * M, 1);
upper.eb(10, M, 1);
// 10x+M-y<=ten[r]M+y-x
lower.eb(11, M - ten[r] * M, 2);
sub(lower, upper, 10, -1, M);
}
{
vc<T3> lower, upper;
lower.eb(0, R1, 1);
upper.eb(0, R2, 1);
lower.eb(1, -ten[r] * M, 1);
upper.eb(10, M, 1);
// 10x+M-y>ten[r]M+y-x
upper.eb(11, M - ten[r] * M, 2);
sub(lower, upper, -1, 1, ten[r] * M);
}
return MP[key] = ANS;
}
mint slowF(ll N) {
mint ANS = 0;
FOR(r, 19) {
FOR(M, 10) {
if (r == 18 && M >= 2) continue;
if (r == 18 && M == 0) continue;
ll ub = N - ten[r] * M;
if (ub <= 0) continue;
auto [s, t] = divmod<ll>(ub, ten[r + 1]);
/*
[10^{r+1}s,10^{r+1}s+t)
[0,10^{r+1}s)
*/
ANS += F2(r, M, s, s + 1, 0, min<ll>(t, ten[r]));
ANS += F2(r, M, 0, s, 0, ten[r]);
}
}
return ANS;
}
mint TEN_F[19];
mint F(ll N) {
mint ANS = 0;
while (N > ten[18]) {
ANS += f(N - 1);
--N;
}
ll n = len(to_string(N));
ANS += TEN_F[n - 1];
if (N == ten[n - 1]) TEN_F[n - 1];
// [ten[n-1],N) の計算をする
FOR(r, n) {
FOR(M, 10) {
if (r == 18 && M >= 2) continue;
if (r == n - 1 && M == 0) continue;
ll ub = N - ten[r] * M;
if (ub <= 0) continue;
auto [s, t] = divmod<ll>(ub, ten[r + 1]);
/*
[10^{r+1}s,10^{r+1}s+t)
[0,10^{r+1}s)
*/
// さらに最高位が 1 以上という条件をつける
ll a = s, b = s + 1;
if (r < n - 1) chmax(a, ten[n - 2 - r]);
if (a < b) ANS += F2(r, M, a, b, 0, min<ll>(t, ten[r]));
a = 0, b = s;
if (r < n - 1) chmax(a, ten[n - 2 - r]);
if (a < b) ANS += F2(r, M, a, b, 0, ten[r]);
}
}
return ANS;
}
void solve() {
LL(L, R);
mint ANS = F(R + 1) - F(L);
print(ANS);
}
void test() {
mint god = 0;
FOR(N, 1, 1000000) {
mint ans = F(N);
SHOW(N, god, ans);
assert(ans == god);
god += f(N);
}
}
signed main() {
ten[0] = 1;
FOR(i, 19) ten[i + 1] = ten[i] * 10;
FOR(K, 19) { TEN_F[K] = slowF(ten[K]); }
// test();
// return 0;
INT(T);
FOR(T) solve();
}
这程序好像有点Bug,我给组数据试试?
详细
Test #1:
score: 100
Accepted
time: 11ms
memory: 4260kb
input:
2 108 112 114514 1919810
output:
31 86328270
result:
ok 2 lines
Test #2:
score: 0
Accepted
time: 453ms
memory: 19440kb
input:
1000 108 112 114514 1919810 1000000000000000000 1000000000000000000 10 1000000000000000000 100000000000000000 1000000000000000000 404718167579889375 404718167579889376 421944017227403970 421944017227403971 189682000860657168 189682000860657168 216210251475406689 216210251475406690 688200258410653365...
output:
31 86328270 1 452700982 455999919 350342417 389080093 670975168 518392877 555093785 413297421 235070083 138094687 605211889 318867094 71967670 277827524 698329989 308576750 857743987 133005695 138983066 102622955 299442575 85677303 140571610 102310491 589625139 652245813 131923105 229861338 83602964...
result:
ok 1000 lines
Test #3:
score: 0
Accepted
time: 455ms
memory: 19248kb
input:
1000 108 112 114514 1919810 1000000000000000000 1000000000000000000 10 1000000000000000000 100000000000000000 1000000000000000000 234530223589181386 234530223589181386 408551941144630716 408551941144630717 158047031427710586 158047031427710586 489780405752551905 489780405752551905 740503344316362098...
output:
31 86328270 1 452700982 455999919 354651163 527842449 269663555 262771500 848282491 242561074 704232081 312867565 122009887 860436261 349789684 224845008 625633663 232585111 280840549 194288301 489686304 68118617 241766024 108426771 893336538 86863459 891261681 845080039 20869324 227720620 111588919...
result:
ok 1000 lines
Test #4:
score: 0
Accepted
time: 51ms
memory: 5764kb
input:
100 265714758284843092 265714758284843093 918065131742690352 918065131742690353 10974116958420843 10974116958420844 400062241898390772 400062241898390773 953883181221418384 953883181221418385 717995546146120948 717995546146120949 822140371684157809 822140371684157809 70453204366469836 70453204366469...
output:
38256669 350749557 102640651 996657063 464929586 143749188 137982562 592033265 616778974 312738452 262527485 162305811 481926909 18789782 482531634 674023418 267293175 47539540 201887243 286594273 454003836 348034968 848568687 385866275 637829215 477702784 177756297 636074139 142434433 101319133 129...
result:
ok 100 lines
Test #5:
score: 0
Accepted
time: 51ms
memory: 5348kb
input:
100 266540997167959220 266540997167959224 881371880336470942 881371880336470942 596383801642802764 596383801642802773 64197408773386902 64197408773386903 418807658396628736 418807658396628737 127608880971207922 127608880971207932 363522998002087569 363522998002087569 52330388046761516 52330388046761...
output:
492908875 248333754 464189675 137174362 44357843 279589454 361435429 38982083 189242392 227795545 753619475 435729649 553495445 382101043 203511016 560656795 359293254 201283527 312112023 427713500 966684108 572909965 777786843 388192689 373080269 471468826 71392278 820936005 369968463 442142900 903...
result:
ok 100 lines
Test #6:
score: 0
Accepted
time: 48ms
memory: 5756kb
input:
100 267367244641009940 267367244641010032 621306592075475643 621306592075475702 405165527476927880 405165527476927910 951704612503158912 951704612503158933 791504024322595587 791504024322595654 324995645468352 324995645468424 3487150939887651 3487150939887746 25506937973764579 25506937973764646 6648...
output:
748774768 749854946 224633394 868005106 885771221 973275841 481554192 328724038 449921321 298758451 929139202 369892070 57450776 659609011 370437937 899756126 156499129 295187384 315182333 70381598 962516228 145843164 335134710 302968586 821989155 688239354 373907729 332948458 709177969 48081665 492...
result:
ok 100 lines
Test #7:
score: 0
Accepted
time: 46ms
memory: 5528kb
input:
100 268193483524126068 268193483524126706 584613336374288936 584613336374289560 990575220751244394 990575220751244660 839211816232930932 839211816232931461 164200394543529742 164200394543530260 873041110319728774 873041110319729095 643451299582720427 643451299582721397 998683496490702225 99868349649...
output:
541124515 452554083 901294590 328726088 872064661 840792649 969205371 150814671 918317978 456593874 574849872 971431007 797833757 899353964 93205153 738388149 938236044 778837819 811645247 155264626 196389571 127343374 811561515 622064959 299017966 830067350 7605147 427644584 676349531 326944959 771...
result:
ok 100 lines
Test #8:
score: 0
Accepted
time: 51ms
memory: 5468kb
input:
100 269019726702209492 269019726702210679 547920080673102230 547920080673110573 575984909730593620 575984909730599719 503346978812959766 503346978812964013 536896760469496592 536896760469496932 745757220699021908 745757220699029249 283415456815487804 283415456815497293 748488013857896695 74848801385...
output:
630143488 554659288 131732449 244134847 983399164 103709492 411572482 50687205 875000248 663701774 692364937 153176156 160965841 745894305 777957749 621234039 499394977 792134600 459831956 772850159 1922144 665492783 684136128 307621919 549188007 550263368 837032989 847040150 374811754 30559164 6252...
result:
ok 100 lines
Test #9:
score: 0
Accepted
time: 51ms
memory: 5464kb
input:
100 269845965585325620 269845965585398094 287854792412106931 287854792412107682 384766635564718736 384766635564748682 390854186837699081 390854186837705800 909593130690430739 909593130690441881 618473335373282339 618473335373380371 923379609753287877 923379609753345817 721664568079867054 72166456807...
output:
14112631 437890253 473927355 820249226 64428166 3557116 606424071 732259247 100860470 374031275 310745027 889012707 891178522 679910539 322174605 438425709 785596604 816821860 469800459 404629041 731679173 58284425 461454737 207298177 491319844 844428058 894669664 183876436 296582846 291041012 93416...
result:
ok 100 lines
Test #10:
score: 0
Accepted
time: 51ms
memory: 5508kb
input:
100 359280689112103486 359280689112186393 176110798769117224 176110798769169811 635753196789286559 635753196789368788 901357146438813768 901357146438868034 227473967007487837 227473967007579558 803441576195331266 803441576195368323 670735071175295768 670735071175317705 961323991610147027 96132399161...
output:
530576123 404434764 429196429 368891722 361257868 665081089 706726185 79237992 29920318 525953761 708574458 231676278 843447593 15785648 685747511 58099602 711218496 744994770 360679445 895697462 1427024 691104492 402709773 999695550 904710365 466845262 657499956 65672541 555077622 657928223 6035297...
result:
ok 100 lines
Test #11:
score: 0
Accepted
time: 50ms
memory: 5756kb
input:
100 270672213058376340 270672213059007687 251161541005887520 251161541006681946 970176324544067953 970176324544299146 54989353712695211 54989353713418261 282289500911364894 282289500911830872 714561486902318658 714561486902628096 786715795250896551 786715795251353285 471469089742028820 4714690897430...
output:
274057095 746587264 972818351 383082731 488949249 267232120 97494234 198830243 119563401 959341276 386415319 161420006 850411589 999908702 611616994 636934330 234691490 491280604 319991400 578152113 465742161 271626206 725842128 806485910 45270073 706815140 366292342 282173164 170266305 614246368 56...
result:
ok 100 lines
Test #12:
score: 0
Accepted
time: 51ms
memory: 5760kb
input:
100 367392890842765685 367392890843416607 193086988313596028 193086988314577917 706498708545222755 706498708545997685 742584464306229097 742584464306325903 543459535787052367 543459535787950089 129009492275582495 129009492275780146 829033685340117897 829033685341074230 832533203363888214 83253320336...
output:
933722794 673949049 476021589 567968289 839231472 980043759 501049818 263513819 490291147 176528809 91205277 238306193 460554433 552061274 642241119 686497395 783942892 392408769 251433460 704081924 127341421 789127034 625359848 117481838 973866396 893053173 90575370 505102736 767173156 94918986 649...
result:
ok 100 lines
Test #13:
score: 0
Accepted
time: 51ms
memory: 5444kb
input:
100 271498451941492468 271498451941501050 991096248449924916 991096248459048412 778958050378193069 778958050386652186 942496553147499926 942496553157050223 654985866837331745 654985866842738051 587277601576579089 587277601584495725 426679948188696632 426679948192334274 444645639669031883 44464563967...
output:
595437314 895524963 307660359 552847643 870041807 668834065 116071711 909436399 376440866 471860351 953824854 439592854 440357954 577049511 479063759 192906449 419074123 141935881 548904120 316920565 709070938 406960198 517004652 167766002 257736425 664009759 126009479 342796888 889680716 4483712 95...
result:
ok 100 lines
Test #14:
score: 0
Accepted
time: 51ms
memory: 5460kb
input:
100 375505101163362477 375505101167848427 210063182153042128 210063182155822491 242044574620878655 242044574622581586 978225419003422132 978225419008913020 194630360825574585 194630360828089959 112507673099759950 112507673106111587 25126978475415749 25126978483626127 378397406768899039 3783974067700...
output:
533740006 74104872 662546292 680130200 873265432 271928992 108601773 474352073 985100322 323145691 384774730 129852585 659343541 636743068 683207714 866667327 872197361 33161934 265884728 505543048 753127768 225929039 524509414 446603107 623105737 498931617 177556703 196898065 365275363 677359980 27...
result:
ok 100 lines
Test #15:
score: 0
Accepted
time: 48ms
memory: 5528kb
input:
100 272324690824608596 272324690834840063 954402997043705505 954402997134155514 364367743652509591 364367743674453965 606631724317463352 606631724355752516 27682237058265900 27682237124555690 459993716250839520 459993716255273417 66644101126496713 66644101129223855 194450161331193649 194450161386135...
output:
534834674 601125917 505856035 376862455 760979514 641392989 283786554 630562757 820710017 8852493 791959762 170760250 378861434 495249796 691978152 588621557 725239134 547380557 772651037 991968579 384495860 492374420 375979785 533581288 199813841 810634122 522431715 516084918 251005920 976615925 86...
result:
ok 100 lines
Test #16:
score: 0
Accepted
time: 51ms
memory: 5416kb
input:
100 160245266039248788 160245266094071181 3667334842745043 3667334937620162 656876281964062643 656876282037272083 488016689359782662 488016689390920442 823387845957619817 823387846023626433 851990572454681907 851990572472489168 807046734461902933 807046734498848823 433789415110749667 433789415119730...
output:
139079928 149109722 360609190 337684003 711803729 163045529 754168681 955325585 268241301 722707794 545626091 782444128 230908898 692554518 200604399 894810233 328331680 965392244 878974694 993927188 31213214 118072440 885317891 675800024 459841672 789365173 566023398 959109988 32912416 617696117 56...
result:
ok 100 lines
Test #17:
score: 0
Accepted
time: 51ms
memory: 5588kb
input:
100 273150934002692020 273150934137711397 694337708782710206 694337709101867684 949777432631858809 949777433190473426 494138923752268075 494138924542786857 400378607279200047 400378607446598315 332709826630132654 332709827207801373 706608249769329490 706608250084711188 167626711258196712 16762671222...
output:
777193 758196118 674708812 476416687 430466802 863758330 807536548 53017126 765761768 628203367 720774132 679991797 569565139 287206776 384674489 589205041 130756500 336175976 217221115 399415283 280904370 224153410 887616871 198744326 814405515 534007992 291101481 856514361 105612774 516430672 4876...
result:
ok 100 lines
Test #18:
score: 0
Accepted
time: 54ms
memory: 5420kb
input:
100 168357472064878283 168357472377080692 20643520092256551 20643520964300165 71707989307246640 71707989395716723 360732804034043093 360732804852354174 463351994600452602 463351995478034699 825167122381684970 825167123114138317 907739281745150692 907739281877330895 734417525279147685 734417526247541...
output:
527777631 280754280 903203963 546663675 693394618 638699147 674155127 427449178 461547851 269708611 57872619 462764371 174437839 792844566 789652737 940883604 381100676 670068627 324440433 410926129 517314783 448965971 28444229 960075850 792736561 979641082 874025472 485285682 805664247 512283757 54...
result:
ok 100 lines
Test #19:
score: 0
Accepted
time: 55ms
memory: 5992kb
input:
100 996517375802030536 996517383244307242 624045669640274152 624045675151906681 778062383071550184 778062385105285599 661230177799844003 661230184066326057 891967553796619192 891967554883508711 780045434223219594 780045437574966221 732895008312183571 732895013649168772 494244581673542382 49424458805...
output:
603358902 946659907 69639350 412873138 43851274 347582604 430348910 724750977 577116598 191811936 384465451 69711558 647643793 158380358 488602266 495914119 730573381 435733172 893096771 35236726 62702945 448029104 550477697 417630378 95859117 448262354 577340835 818272654 107079158 8501638 3512862 ...
result:
ok 100 lines
Test #20:
score: 0
Accepted
time: 55ms
memory: 5704kb
input:
100 665165169508614046 665165179308388125 450715146361595040 450715151403890645 852288517283002988 852288518381862337 913315629503532549 913315630749855704 532462495277029144 532462498071371915 282596655433296453 282596657415148520 683144464137990864 683144473924438526 349993667306263606 34999367663...
output:
676409079 248503071 835276063 68328528 772215741 161641342 649160033 145596932 464410493 652357520 889069440 195937859 44973934 612939926 22202365 143922420 82103816 639580941 324839593 523358361 244842526 110905708 83984952 541060506 789057544 529241261 253379953 739426786 952890997 470282487 10651...
result:
ok 100 lines
Test #21:
score: 0
Accepted
time: 63ms
memory: 5860kb
input:
100 997343614685146664 997343624619479843 363980381379278852 363980403321014434 363472072050899411 363472127950133638 548737381529616022 548737411001888848 264663915427618756 264663997375616523 652761544602512729 652761633020765557 372859165544950948 372859211463042316 467421135895512741 46742122450...
output:
737730842 860606001 314971159 733441968 622555356 750487156 627988141 828697987 24522167 719208260 924203589 596796697 57593544 237827530 106773768 122048012 456140029 884807190 686218499 24730499 210981284 886965046 555818823 208641222 708285726 420456922 132626512 370310176 938203036 303105975 997...
result:
ok 100 lines
Test #22:
score: 0
Accepted
time: 63ms
memory: 5864kb
input:
100 673277379829210837 673277471201818312 467691335906073843 467691369092707115 267120228921154281 267120256250709434 951749761490869436 951749787765452026 516040690038588870 516040696098399577 48815722312898739 48815732448107925 248654399360662910 248654406658876245 446844358605735311 4468443938209...
output:
488865006 408681654 344430281 503237027 318894325 707123583 654184523 826904401 888285158 20756334 570715099 886727446 636858208 36539606 831227472 953988820 112285385 802225729 512210639 778069236 854518210 310348760 216242344 779648034 635076750 675089725 953443924 837595540 520890688 425809692 13...
result:
ok 100 lines
Test #23:
score: 0
Accepted
time: 60ms
memory: 6344kb
input:
100 998169857863230088 998169927750612370 327287125678092146 327287953703977574 658646845480129774 658647393882529027 626578941132541610 626579226776457106 234880613967299154 234881273237546773 354775524341034009 354775842818772160 994712817104945897 994713470364435846 381664360721557275 38166521531...
output:
180508078 274676000 612715865 558006497 983675161 457678211 919784922 225973187 389000316 170014928 75685750 86773616 697877926 71337359 335452027 103298007 446940346 716630540 139606015 800558380 291961836 415681597 18228683 974653552 6964515 104347755 638992085 8342963 533270545 397389138 76578005...
result:
ok 100 lines
Test #24:
score: 0
Accepted
time: 68ms
memory: 6100kb
input:
100 681389581559873037 681389861976699736 261295488595776758 261296088713576982 681951931969370973 681952425249720148 990183902068140914 990184538747270993 499618889095115892 499618948113253152 591662752337725127 591662816717045765 37536371438110845 37537289233777495 767067082465015609 7670675235573...
output:
935191040 358397958 25088967 117884558 164475618 943770200 791122172 796618665 197212957 232776356 548320812 545374899 525654254 97079823 784536601 230576785 653186120 134731219 869351900 624520884 937690867 492303145 64190685 121556519 485761889 62916199 748164522 754911203 248853725 500564851 9143...
result:
ok 100 lines
Test #25:
score: 0
Accepted
time: 71ms
memory: 6184kb
input:
100 998996101041313512 999003126509290541 67221837417096847 67230834622417619 757663491159341040 757664493624095790 100379747839416876 100380396314838305 10056655869487058 10061406118763027 398193778246000886 398197493052993426 652787467125583805 652797314255202325 190402207484677570 190408540282965...
output:
858795874 966091130 354884231 164971052 673861945 475577043 923552252 843889144 494037011 423920510 568192200 557379822 910495603 743661245 507852096 579114833 827307348 78282082 186785349 866182553 787214464 913468828 358027475 473242293 309775493 743923646 631729634 74846801 117687625 470120018 43...
result:
ok 100 lines
Test #26:
score: 0
Accepted
time: 72ms
memory: 6224kb
input:
100 689501787585502532 689508793838945822 278271682435222858 278277481987720231 96783643607522266 96789507110723739 28618038350445105 28624789705346502 706569120711451506 706572365227103645 357881819217327413 357882400970554875 826418339220591475 826424800005903943 50409551261519791 5041833564648875...
output:
358063798 364122089 617127127 367230188 199916060 890315172 946304374 104091643 125442711 785322144 923105759 867147922 145889920 341367972 289403691 382376096 607665269 166405756 904261191 292518377 550243555 990801031 65377720 32378902 628932430 831392035 450616331 354350400 962006536 834017730 58...
result:
ok 100 lines
Test #27:
score: 0
Accepted
time: 71ms
memory: 6504kb
input:
100 999822344219396936 999908320966519365 30528581715910140 30579780652009654 343073180138690266 343100367852967030 764514919009380293 764557270533287993 382753021795453908 382801912622295569 270909888625294021 270941802489404217 292751620063383887 292830534072695367 940206724851872031 9402350340232...
output:
194350135 912687999 578762656 683411075 638912841 429713933 47867629 951252614 11589548 241668617 260620254 902112125 244059006 651723175 315373649 25558771 178554193 258148983 327929366 828823805 646160839 811637875 229429770 688659128 276921447 863040195 796725847 307123468 660264649 593074631 736...
result:
ok 100 lines
Test #28:
score: 0
Accepted
time: 71ms
memory: 6368kb
input:
100 474241952461388843 474318647695045563 295247871979701662 295320879557277436 511615346655738958 511677576085042647 67052170337781991 67057073221677034 690147319767978528 690214717222221319 900728853537121098 900775989512425363 615300311298039411 615347278217454332 184140501918734918 1841781590536...
output:
946776015 229226210 964543991 559696286 549711544 361806773 339126418 262968467 586375443 830332209 856880057 632962144 901788811 125207847 893241758 363738633 180322265 346517941 608141331 147457016 375269176 158300339 672117834 302836332 609194949 936305881 710840763 13197593 959639881 774255047 9...
result:
ok 100 lines
Test #29:
score: 0
Accepted
time: 79ms
memory: 6764kb
input:
100 648583102513073 1363519718193953 770463293454914832 770926698416673552 151854905972815382 152058283231599129 652022118444185017 652096181606274692 755449392016388055 755632414830596369 143626003299554451 144136111925265304 932715773001183959 933341717035383063 913383279073842390 9143215234679333...
output:
626116125 467050156 203823674 835621424 52084980 162731840 263253845 563766357 375723289 575769711 223734677 738508393 506313064 671591605 564906905 334513920 459817861 727749242 841031393 95331639 603428091 394710796 549286160 210974305 947725128 391805006 739046426 264682679 537398393 779575248 93...
result:
ok 100 lines
Test #30:
score: 0
Accepted
time: 79ms
memory: 6556kb
input:
100 482354158487018339 482740546995047295 88852024669404577 89460194827087353 926447053998922946 927105653649168681 105486310915053470 105507324178319485 673725510234570958 674557064921647951 666947920416723384 667499573759277794 404182283375487346 404621797578154446 504363230072982512 5050289973763...
output:
843085673 161755551 791854365 311266943 785990066 132442159 273161411 878325075 356675178 149303366 630521062 292658763 978217039 771463765 881942758 812590380 413017597 29226781 700056176 924445495 931882979 790865108 112451646 954933889 773933298 748578980 369952585 334257542 132507589 901013703 6...
result:
ok 100 lines
Test #31:
score: 0
Accepted
time: 80ms
memory: 6728kb
input:
100 1474821985629201 11418714174861749 733770042048695422 736345648741121104 737264594952164599 747072129195625069 539529322173957036 545435088384266846 128145762237322210 136762921333837718 16342113678847586 25430421361087756 796051958498792633 798896973707562459 663187800736004156 6670080129125769...
output:
965150032 10801000 411009212 395746072 940155158 64926069 992480233 980554742 280573806 76315333 899313123 350761616 331246182 137298080 970661766 227393062 467364681 284496280 827603025 116780591 187019966 70962724 498305995 742169561 306886420 807164116 658822635 508570884 892441674 835716043 1614...
result:
ok 100 lines
Test #32:
score: 0
Accepted
time: 80ms
memory: 6684kb
input:
100 490466364512647834 492634478854803424 105828218508850677 114943592396307525 341278765637074239 347005772363029239 143920447197357652 151657575134890875 657303709291097979 660099412621013224 209794954736517077 210523162301041725 601213917077486921 603507790254265960 50166125263458626 554299480009...
output:
554550782 373444241 808027806 430440268 848933772 381832763 142418000 573285232 450988584 825655885 601641972 4592758 420040661 313135452 443958374 74200437 729862416 665304023 279369500 362498772 213999059 655399445 140256012 497359198 818938780 587397325 28363953 47632494 869739232 384478464 64715...
result:
ok 100 lines
Test #33:
score: 0
Accepted
time: 80ms
memory: 6528kb
input:
100 2301069458679921 61845958371204467 697076786347508715 724392562210788818 322674288226481122 419458012014420364 203664489048953166 204401962602447345 500842132458256357 527893432132043648 889058228353108008 985096767651683684 436016111436592714 491708156670189613 636364354957974515 63906653921199...
output:
539004414 972599289 749575759 470410724 675137818 579004645 418987985 16067847 708073673 890828587 870896379 804449107 683788101 972227074 589696500 59051087 683273787 674470749 848929532 574202337 311240946 123181116 538822764 457728547 763845755 959095105 281259904 108489984 306694725 605011831 65...
result:
ok 100 lines
Test #34:
score: 0
Accepted
time: 80ms
memory: 6656kb
input:
100 498578566243310034 586156369564815651 122804408053329480 126054948815783153 756110468685290931 804533841337213587 182354579184694538 222807821796488776 864253940907433594 957013797175149353 976014021616119354 994756240963791542 758574190675607318 788026762589999066 921436645231734516 97458469506...
output:
852777391 125672248 42649028 335538547 376702921 285474541 643378664 769702819 814895384 92545198 614565449 379650809 566291473 330883660 872375161 832073601 592029944 698336489 663136352 234082221 803693584 651657365 108837194 203418125 348945778 670470842 375434708 110589229 763866485 989784406 86...
result:
ok 100 lines
Test #35:
score: 0
Accepted
time: 73ms
memory: 6460kb
input:
100 3127308341796049 520792311220441865 437011498086513416 520485468026509363 131456014060606238 365408030112235244 91171692778725185 662599337569029319 873538498384223207 924563386419373980 985146379882144327 998630910571391788 75980264374392796 529753231403308819 609540909179944874 863320521570476...
output:
990630623 500644914 983434047 120394410 470793992 995872006 215375742 877344555 134273222 227733931 285737821 483480065 270937132 571219423 760792791 926086392 17863445 424259489 776035266 867017265 368328475 575727868 579916504 987057865 231001717 532366553 896002379 490284880 797478074 893871471 7...
result:
ok 100 lines
Test #36:
score: 0
Accepted
time: 81ms
memory: 6680kb
input:
100 506690772268939530 893059809107673505 916408560743032386 924497071303265925 521119742872856965 953105887068425271 13169357286054774 940017640966343964 832724009205515899 842445203224167389 43709279153689955 722293279367815033 130145114902672296 538867791846928078 553550089218608003 5598900167214...
output:
983597906 83175303 361594391 914308517 118765028 997693869 496599433 3440079 47890119 240163565 856976357 825212152 491058033 315042953 109212050 585397031 364799642 746250177 101037860 362630278 816588885 875280303 283246582 714229016 856296624 478982144 775778644 903827819 392590566 198609138 7333...
result:
ok 100 lines
Test #37:
score: 0
Accepted
time: 11ms
memory: 4220kb
input:
3 1000000000000000000 1000000000000000000 10 1000000000000000000 100000000000000000 1000000000000000000
output:
1 452700982 455999919
result:
ok 3 lines
Extra Test:
score: 0
Extra Test Passed