QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#843319 | #9962. Diminishing Fractions | ucup-team112# | TL | 1577ms | 5448kb | C++20 | 14.2kb | 2025-01-04 17:56:57 | 2025-01-04 17:56:57 |
Judging History
answer
// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
// #define INTERACTIVE
#include <bits/stdc++.h>
using namespace std;
namespace templates {
// type
using ll = long long;
using ull = unsigned long long;
using Pii = pair<int, int>;
using Pil = pair<int, ll>;
using Pli = pair<ll, int>;
using Pll = pair<ll, ll>;
template <class T>
using pq = priority_queue<T>;
template <class T>
using qp = priority_queue<T, vector<T>, greater<T>>;
// clang-format off
#define vec(T, A, ...) vector<T> A(__VA_ARGS__);
#define vvec(T, A, h, ...) vector<vector<T>> A(h, vector<T>(__VA_ARGS__));
#define vvvec(T, A, h1, h2, ...) vector<vector<vector<T>>> A(h1, vector<vector<T>>(h2, vector<T>(__VA_ARGS__)));
// clang-format on
// for loop
#define fori1(a) for (ll _ = 0; _ < (a); _++)
#define fori2(i, a) for (ll i = 0; i < (a); i++)
#define fori3(i, a, b) for (ll i = (a); i < (b); i++)
#define fori4(i, a, b, c) for (ll i = (a); ((c) > 0 || i > (b)) && ((c) < 0 || i < (b)); i += (c))
#define overload4(a, b, c, d, e, ...) e
#define fori(...) overload4(__VA_ARGS__, fori4, fori3, fori2, fori1)(__VA_ARGS__)
// declare and input
// clang-format off
#define INT(...) int __VA_ARGS__; inp(__VA_ARGS__);
#define LL(...) ll __VA_ARGS__; inp(__VA_ARGS__);
#define STRING(...) string __VA_ARGS__; inp(__VA_ARGS__);
#define CHAR(...) char __VA_ARGS__; inp(__VA_ARGS__);
#define DOUBLE(...) double __VA_ARGS__; STRING(str___); __VA_ARGS__ = stod(str___);
#define VEC(T, A, n) vector<T> A(n); inp(A);
#define VVEC(T, A, n, m) vector<vector<T>> A(n, vector<T>(m)); inp(A);
// clang-format on
// const value
const ll MOD1 = 1000000007;
const ll MOD9 = 998244353;
const double PI = acos(-1);
// other macro
#if !defined(RIN__LOCAL) && !defined(INTERACTIVE)
#define endl "\n"
#endif
#define spa ' '
#define len(A) ll(A.size())
#define all(A) begin(A), end(A)
// function
vector<char> stoc(string &S) {
int n = S.size();
vector<char> ret(n);
for (int i = 0; i < n; i++) ret[i] = S[i];
return ret;
}
string ctos(vector<char> &S) {
int n = S.size();
string ret = "";
for (int i = 0; i < n; i++) ret += S[i];
return ret;
}
template <class T>
auto min(const T &a) {
return *min_element(all(a));
}
template <class T>
auto max(const T &a) {
return *max_element(all(a));
}
template <class T, class S>
auto clamp(T &a, const S &l, const S &r) {
return (a > r ? r : a < l ? l : a);
}
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);
}
template <class T, class S>
inline bool chclamp(T &a, const S &l, const S &r) {
auto b = clamp(a, l, r);
return (a != b ? a = b, 1 : 0);
}
template <typename T>
T sum(vector<T> &A) {
T tot = 0;
for (auto a : A) tot += a;
return tot;
}
template <typename T>
vector<T> compression(vector<T> X) {
sort(all(X));
X.erase(unique(all(X)), X.end());
return X;
}
// input and output
namespace io {
// __int128_t
std::istream &operator>>(std::istream &is, __int128_t &value) {
std::string str;
is >> str;
value = 0;
int sign = 1;
for (size_t i = 0; i < str.size(); i++) {
if (i == 0 && str[i] == '-') {
sign = -1;
continue;
}
value = value * 10 + str[i] - '0';
}
value *= sign;
return is;
}
std::ostream &operator<<(std::ostream &dest, __int128_t value) {
std::ostream::sentry s(dest);
if (s) {
__uint128_t tmp = value < 0 ? -value : value;
char buffer[128];
char *d = std::end(buffer);
do {
--d;
*d = "0123456789"[tmp % 10];
tmp /= 10;
} while (tmp != 0);
if (value < 0) {
--d;
*d = '-';
}
int len = std::end(buffer) - d;
if (dest.rdbuf()->sputn(d, len) != len) {
dest.setstate(std::ios_base::badbit);
}
}
return dest;
}
// vector<T>
template <typename T>
istream &operator>>(istream &is, vector<T> &A) {
for (auto &a : A) is >> a;
return is;
}
template <typename T>
ostream &operator<<(ostream &os, vector<T> &A) {
for (size_t i = 0; i < A.size(); i++) {
os << A[i];
if (i != A.size() - 1) os << ' ';
}
return os;
}
// vector<vector<T>>
template <typename T>
istream &operator>>(istream &is, vector<vector<T>> &A) {
for (auto &a : A) is >> a;
return is;
}
template <typename T>
ostream &operator<<(ostream &os, vector<vector<T>> &A) {
for (size_t i = 0; i < A.size(); i++) {
os << A[i];
if (i != A.size() - 1) os << endl;
}
return os;
}
// pair<S, T>
template <typename S, typename T>
istream &operator>>(istream &is, pair<S, T> &A) {
is >> A.first >> A.second;
return is;
}
template <typename S, typename T>
ostream &operator<<(ostream &os, pair<S, T> &A) {
os << A.first << ' ' << A.second;
return os;
}
// vector<pair<S, T>>
template <typename S, typename T>
istream &operator>>(istream &is, vector<pair<S, T>> &A) {
for (size_t i = 0; i < A.size(); i++) {
is >> A[i];
}
return is;
}
template <typename S, typename T>
ostream &operator<<(ostream &os, vector<pair<S, T>> &A) {
for (size_t i = 0; i < A.size(); i++) {
os << A[i];
if (i != A.size() - 1) os << endl;
}
return os;
}
// tuple
template <typename T, size_t N>
struct TuplePrint {
static ostream &print(ostream &os, const T &t) {
TuplePrint<T, N - 1>::print(os, t);
os << ' ' << get<N - 1>(t);
return os;
}
};
template <typename T>
struct TuplePrint<T, 1> {
static ostream &print(ostream &os, const T &t) {
os << get<0>(t);
return os;
}
};
template <typename... Args>
ostream &operator<<(ostream &os, const tuple<Args...> &t) {
TuplePrint<decltype(t), sizeof...(Args)>::print(os, t);
return os;
}
// io functions
void FLUSH() {
cout << flush;
}
void print() {
cout << endl;
}
template <class Head, class... Tail>
void print(Head &&head, Tail &&...tail) {
cout << head;
if (sizeof...(Tail)) cout << spa;
print(std::forward<Tail>(tail)...);
}
template <typename T, typename S>
void prisep(vector<T> &A, S sep) {
int n = A.size();
for (int i = 0; i < n; i++) {
cout << A[i];
if (i != n - 1) cout << sep;
}
cout << endl;
}
template <typename T, typename S>
void priend(T A, S end) {
cout << A << end;
}
template <typename T>
void prispa(T A) {
priend(A, spa);
}
template <typename T, typename S>
bool printif(bool f, T A, S B) {
if (f)
print(A);
else
print(B);
return f;
}
template <class... T>
void inp(T &...a) {
(cin >> ... >> a);
}
} // namespace io
using namespace io;
// read graph
vector<vector<int>> read_edges(int n, int m, bool direct = false, int indexed = 1) {
vector<vector<int>> edges(n, vector<int>());
for (int i = 0; i < m; i++) {
INT(u, v);
u -= indexed;
v -= indexed;
edges[u].push_back(v);
if (!direct) edges[v].push_back(u);
}
return edges;
}
vector<vector<int>> read_tree(int n, int indexed = 1) {
return read_edges(n, n - 1, false, indexed);
}
template <typename T = long long>
vector<vector<pair<int, T>>> read_wedges(int n, int m, bool direct = false, int indexed = 1) {
vector<vector<pair<int, T>>> edges(n, vector<pair<int, T>>());
for (int i = 0; i < m; i++) {
INT(u, v);
T w;
inp(w);
u -= indexed;
v -= indexed;
edges[u].push_back({v, w});
if (!direct) edges[v].push_back({u, w});
}
return edges;
}
template <typename T = long long>
vector<vector<pair<int, T>>> read_wtree(int n, int indexed = 1) {
return read_wedges<T>(n, n - 1, false, indexed);
}
// yes / no
namespace yesno {
// yes
inline bool yes(bool f = true) {
cout << (f ? "yes" : "no") << endl;
return f;
}
inline bool Yes(bool f = true) {
cout << (f ? "Yes" : "No") << endl;
return f;
}
inline bool YES(bool f = true) {
cout << (f ? "YES" : "NO") << endl;
return f;
}
// no
inline bool no(bool f = true) {
cout << (!f ? "yes" : "no") << endl;
return f;
}
inline bool No(bool f = true) {
cout << (!f ? "Yes" : "No") << endl;
return f;
}
inline bool NO(bool f = true) {
cout << (!f ? "YES" : "NO") << endl;
return f;
}
// possible
inline bool possible(bool f = true) {
cout << (f ? "possible" : "impossible") << endl;
return f;
}
inline bool Possible(bool f = true) {
cout << (f ? "Possible" : "Impossible") << endl;
return f;
}
inline bool POSSIBLE(bool f = true) {
cout << (f ? "POSSIBLE" : "IMPOSSIBLE") << endl;
return f;
}
// impossible
inline bool impossible(bool f = true) {
cout << (!f ? "possible" : "impossible") << endl;
return f;
}
inline bool Impossible(bool f = true) {
cout << (!f ? "Possible" : "Impossible") << endl;
return f;
}
inline bool IMPOSSIBLE(bool f = true) {
cout << (!f ? "POSSIBLE" : "IMPOSSIBLE") << endl;
return f;
}
// Alice Bob
inline bool Alice(bool f = true) {
cout << (f ? "Alice" : "Bob") << endl;
return f;
}
inline bool Bob(bool f = true) {
cout << (f ? "Bob" : "Alice") << endl;
return f;
}
// Takahashi Aoki
inline bool Takahashi(bool f = true) {
cout << (f ? "Takahashi" : "Aoki") << endl;
return f;
}
inline bool Aoki(bool f = true) {
cout << (f ? "Aoki" : "Takahashi") << endl;
return f;
}
} // namespace yesno
using namespace yesno;
} // namespace templates
using namespace templates;
const int N = 50050;
vector<bool> is_prime(N);
vector<string> memo(N);
void init() {
memo.assign(N, "");
is_prime.assign(N, true);
is_prime[0] = is_prime[1] = false;
for (int i = 2; i * i < N; i++) {
if (is_prime[i]) {
for (int j = i * 2; j < N; j += i) {
is_prime[j] = false;
}
}
}
}
template <typename T>
T modinv(T a, T MOD) {
T b = MOD;
T u = 1;
T v = 0;
while (b > 0) {
T t = a / b;
a -= t * b;
u -= t * v;
std::swap(a, b);
std::swap(u, v);
}
if (a != 1) return -1;
if (u < 0) u += MOD;
return u;
}
template <typename T, typename S>
T modpow(T a, S b, T MOD) {
T ret = 1;
while (b > 0) {
if (b & 1) {
ret *= a;
ret %= MOD;
}
a *= a;
a %= MOD;
b >>= 1;
}
return ret;
}
void solve() {
INT(n);
if (n == 1) {
print("1/1");
return;
}
vec(ll, X, 0);
ll ma = 0;
fori(i, 1, n + 1) {
if (!is_prime[i]) continue;
ll x = i;
while (x * i <= n) {
x *= i;
}
if (x != i) ma = max<int>(ma, x);
X.push_back(x);
}
sort(all(X));
int lx = X.size();
vec(ll, Y, lx);
double tot = 0.0;
string ans = "";
fori(i, lx) {
ll x = X[i];
ll p = 1;
fori(j, lx) {
if (i == j) continue;
p = p * X[j] % x;
}
auto y = modinv(p, x);
assert(y * p % x == 1);
Y[i] = x - y;
ans += "-" + to_string(Y[i]) + "/" + to_string(X[i]);
tot += double(Y[i]) / double(X[i]);
}
if (n <= 10) {
double x = 1.0;
for (int i = 1; i <= n; i++) {
x /= i;
}
tot += x;
}
ans += "+" + to_string(int(round(tot))) + "/" + "1";
memo[X.back()] = ans;
print(ans);
}
int main() {
init();
#ifndef INTERACTIVE
std::cin.tie(0)->sync_with_stdio(0);
#endif
// std::cout << std::fixed << std::setprecision(12);
int t;
t = 1;
std::cin >> t;
while (t--) solve();
return 0;
}
// // #pragma GCC target("avx2")
// // #pragma GCC optimize("O3")
// // #pragma GCC optimize("unroll-loops")
// // #define INTERACTIVE
//
// #include "kyopro-cpp/template.hpp"
//
// const int N = 50050;
// vector<bool> is_prime(N);
// vector<string> memo(N);
//
// void init() {
// memo.assign(N, "");
// is_prime.assign(N, true);
// is_prime[0] = is_prime[1] = false;
// for (int i = 2; i * i < N; i++) {
// if (is_prime[i]) {
// for (int j = i * 2; j < N; j += i) {
// is_prime[j] = false;
// }
// }
// }
// }
//
// #include "math/modinv.hpp"
// #include "math/modpow.hpp"
//
// void solve() {
// INT(n);
// if (n == 1) {
// print("1/1");
// return;
// }
//
// vec(ll, X, 0);
// ll ma = 0;
// fori(i, 1, n + 1) {
// if (!is_prime[i]) continue;
// ll x = i;
// while (x * i <= n) {
// x *= i;
// }
// if (x != i) ma = max<int>(ma, x);
// X.push_back(x);
// }
//
// sort(all(X));
//
// int lx = X.size();
// vec(ll, Y, lx);
// double tot = 0.0;
//
// string ans = "";
//
// fori(i, lx) {
// ll x = X[i];
// ll p = 1;
// fori(j, lx) {
// if (i == j) continue;
// p = p * X[j] % x;
// }
//
// auto y = modinv(p, x);
// assert(y * p % x == 1);
// Y[i] = x - y;
//
// ans += "-" + to_string(Y[i]) + "/" + to_string(X[i]);
// tot += double(Y[i]) / double(X[i]);
// }
//
// if (n <= 10) {
// double x = 1.0;
// for (int i = 1; i <= n; i++) {
// x /= i;
// }
// tot += x;
// }
// ans += "+" + to_string(int(round(tot))) + "/" + "1";
// memo[X.back()] = ans;
// print(ans);
// }
//
// int main() {
// init();
// #ifndef INTERACTIVE
// std::cin.tie(0)->sync_with_stdio(0);
// #endif
// // std::cout << std::fixed << std::setprecision(12);
// int t;
// t = 1;
// std::cin >> t;
// while (t--) solve();
// return 0;
// }
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 4488kb
input:
2 3 6
output:
-1/2-1/3+1/1 -1/3-1/4-2/5+1/1
result:
ok OK, t = 2
Test #2:
score: 0
Accepted
time: 1ms
memory: 4508kb
input:
1 1
output:
1/1
result:
ok OK, t = 1
Test #3:
score: 0
Accepted
time: 1ms
memory: 4564kb
input:
10 1 2 3 4 5 6 7 8 9 10
output:
1/1 -1/2+1/1 -1/2-1/3+1/1 -2/3-1/4+1/1 -1/3-1/4-2/5+1/1 -1/3-1/4-2/5+1/1 -1/3-3/4-1/5-5/7+2/1 -2/3-3/5-6/7-7/8+3/1 -1/5-2/7-5/8-8/9+2/1 -1/5-2/7-5/8-8/9+2/1
result:
ok OK, t = 10
Test #4:
score: 0
Accepted
time: 1ms
memory: 4504kb
input:
54 7 20 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 3 47 81
output:
-1/3-3/4-1/5-5/7+2/1 -2/5-5/7-4/9-2/11-9/13-1/16-5/17-4/19+3/1 -1/2+1/1 -1/2-1/3+1/1 -2/3-1/4+1/1 -1/3-1/4-2/5+1/1 -1/3-1/4-2/5+1/1 -1/3-3/4-1/5-5/7+2/1 -2/3-3/5-6/7-7/8+3/1 -1/5-2/7-5/8-8/9+2/1 -1/5-2/7-5/8-8/9+2/1 -1/5-4/7-7/8-4/9-10/11+3/1 -1/5-4/7-7/8-4/9-10/11+3/1 -2/5-3/7-3/8-1/9-5/11-3/13+2/1...
result:
ok OK, t = 54
Test #5:
score: 0
Accepted
time: 3ms
memory: 4464kb
input:
92 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 159 162 165 168 171 174 177 180 183 186 189 192 195 198 201 204 207 210 213 216 219 222 225 228 231 234 237 240 243 246 249 252 255 258 261 264 267 270 273 276 279 282 28...
output:
-1/11-11/13-6/17-11/19-4/23-4/25-25/27-5/29-13/31-5/32-16/37-15/41-13/43-26/47-23/49+6/1 -5/11-11/13-3/17-2/19-17/23-18/25-2/27-28/29-2/31-17/32-1/37-32/41-40/43-20/47-18/49-42/53+8/1 -5/11-11/13-3/17-2/19-17/23-18/25-2/27-28/29-2/31-17/32-1/37-32/41-40/43-20/47-18/49-42/53+8/1 -4/11-9/13-11/17-1/19...
result:
ok OK, t = 92
Test #6:
score: 0
Accepted
time: 73ms
memory: 4936kb
input:
1000 622 149 839 472 292 345 799 941 449 15 907 494 48 430 505 66 83 97 10 548 286 644 528 249 573 860 557 932 746 262 971 157 603 715 984 333 53 916 784 649 70 768 780 64 118 616 979 466 24 2 517 774 566 419 182 222 40 169 951 830 977 383 355 770 134 973 917 3 854 31 35 825 109 945 671 536 952 888 ...
output:
-22/29-10/31-9/37-26/41-18/43-6/47-49/53-41/59-10/61-17/67-53/71-7/73-32/79-6/83-7/89-12/97-11/101-92/103-41/107-33/109-85/113-26/121-123/125-111/127-40/131-103/137-116/139-142/149-22/151-82/157-155/163-147/167-158/169-103/173-41/179-141/181-61/191-73/193-183/197-92/199-109/211-115/223-83/227-101/22...
result:
ok OK, t = 1000
Test #7:
score: 0
Accepted
time: 386ms
memory: 5112kb
input:
1000 1748 1741 1576 1940 1648 1825 1183 1447 1318 1277 1913 1208 1417 1388 1143 1581 1222 1904 1407 1006 1175 1218 1734 1934 1003 1704 1984 1399 1333 1840 1317 1233 1133 1232 1776 1881 1476 1712 1401 1231 1978 1964 1419 1644 1103 1498 1454 1480 1377 1352 1837 1616 1009 1413 1199 1977 1477 1579 1920 ...
output:
-22/43-24/47-6/53-45/59-42/61-10/67-45/71-59/73-59/79-40/83-24/89-34/97-94/101-43/103-19/107-105/109-6/113-35/127-47/131-117/137-62/139-7/149-87/151-49/157-72/163-63/167-7/169-124/173-159/179-71/181-67/191-83/193-169/197-22/199-201/211-186/223-109/227-141/229-224/233-206/239-179/241-107/251-67/257-2...
result:
ok OK, t = 1000
Test #8:
score: 0
Accepted
time: 901ms
memory: 5264kb
input:
1000 2107 2115 2985 2832 2564 2529 2971 2637 2666 2172 2496 2191 2465 2199 2260 2161 2402 2369 2762 2674 2734 2252 2488 2185 2652 2014 2018 2960 2313 2063 2696 2976 2457 2247 2180 2647 2907 2901 2912 2538 2512 2623 2267 2986 2348 2170 2131 2166 2563 2111 2860 2254 2462 2080 2054 2803 2397 2778 2411 ...
output:
-33/47-22/53-2/59-3/61-45/67-17/71-38/73-38/79-50/83-63/89-68/97-58/101-80/103-53/107-54/109-56/113-60/127-73/131-99/137-24/139-144/149-99/151-55/157-66/163-21/167-151/169-49/173-22/179-4/181-98/191-48/193-13/197-74/199-103/211-177/223-200/227-157/229-11/233-135/239-197/241-76/251-28/257-110/263-14/...
result:
ok OK, t = 1000
Test #9:
score: 0
Accepted
time: 1577ms
memory: 5448kb
input:
1000 3416 3784 3793 3610 3982 3174 3253 3088 3197 3926 3664 3669 3431 3821 3340 3298 3498 3627 3194 3354 3362 3512 3865 3529 3988 3973 3852 3552 3672 3282 3035 3639 3998 3090 3771 3618 3402 3139 3903 3110 3452 3947 3941 3225 3187 3283 3243 3722 3808 3491 3309 3935 3937 3259 3909 3665 3809 3390 3285 ...
output:
-29/59-3/61-57/67-70/71-36/73-69/79-72/83-8/89-60/97-72/101-49/103-87/107-89/109-90/113-106/127-25/131-35/137-96/139-132/149-110/151-135/157-115/163-63/167-143/173-63/179-67/181-78/191-38/193-71/197-109/199-2/211-152/223-212/227-190/229-9/233-71/239-124/241-35/251-55/257-143/263-124/269-256/271-38/2...
result:
ok OK, t = 1000
Test #10:
score: -100
Time Limit Exceeded
input:
899 4695 4616 4545 4771 4315 4850 4821 4722 4493 4338 4566 4144 4721 4334 4536 4313 4264 4669 4648 4780 4551 4044 4506 4798 4483 4372 4371 4636 4650 4590 4340 4383 4756 4104 4077 4067 4692 4008 4141 4610 4532 4751 4345 4498 4214 4621 4519 4505 4681 4726 4011 4879 4103 4283 4470 4844 4520 4740 4333 4...
output:
-61/71-29/73-14/79-70/83-68/89-26/97-62/101-12/103-52/107-19/109-12/113-82/127-33/131-67/137-38/139-79/149-64/151-147/157-141/163-112/167-64/173-81/179-34/181-105/191-31/193-115/197-108/199-197/211-145/223-217/227-94/229-8/233-185/239-60/241-53/251-155/257-136/263-183/269-153/271-224/277-105/281-274...