QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#737507 | #9622. 有限小数 | isaunoya | AC ✓ | 83ms | 3756kb | C++23 | 4.8kb | 2024-11-12 16:01:30 | 2024-11-12 16:01:40 |
Judging History
answer
#if defined(local)
#include "./noya/debug.hpp"
#else
#define debug(...) 42
#endif
#include "bits/stdc++.h"
using namespace std;
#define rep1(a) for (int i = 0; i < a; i++)
#define rep2(i, a) for (int i = 0; i < a; i++)
#define rep3(i, a, b) for (int i = a; i < b; i++)
#define rep4(i, a, b, c) for (int i = a; i < b; i += c)
#define overload4(a, b, c, d, e, ...) e
#define rep(...) overload4(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__)
#define pb emplace_back
template <typename T, typename T2> void cmin(T &x, const T2 &y) {
x = x < y ? x : y;
}
template <typename T, typename T2> void cmax(T &x, const T2 &y) {
x = x > y ? x : y;
}
#include <cstdint>
using ll = int64_t;
using ull = uint64_t;
namespace noya {
template <class T> constexpr T infty = 0;
template <> constexpr int infty<int> = 1010000000;
template <> constexpr ll infty<ll> = 2020000000000000000;
template <> constexpr unsigned infty<unsigned> = infty<int>;
template <>
constexpr ull infty<ull> = infty<ll>;
template <>
constexpr __int128 infty<__int128> =
__int128(infty<ll>) * 2000000000000000000;
template <> constexpr double infty<double> = infty<ll>;
template <> constexpr long double infty<long double> = infty<ll>;
} // namespace noya
using vi = vector<int>;
using vl = vector<ll>;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
template <class T> using vc = vector<T>;
const int INF = 1010000000;
const ll LNF = 1010000000000000000;
#define sz(x) int((x).size())
#define all(x) begin(x), end(x)
#define fi first
#define se second
namespace noya {}
#include <algorithm>
#include <cassert>
#include <functional>
#include <vector>
// https://github.com/the-tourist/algo/blob/master/numeric/extgcd.cpp
template <typename T> T extgcd(T a, T b, T &x, T &y) {
if (a == 0) {
x = 0;
y = 1;
return b;
}
T p = b / a;
T g = extgcd(b - p * a, a, y, x);
x -= p * y;
return g;
}
template <typename T> bool diophantine(T a, T b, T c, T &x, T &y, T &g) {
if (a == 0 && b == 0) {
if (c == 0) {
x = y = g = 0;
return true;
}
return false;
}
if (a == 0) {
if (c % b == 0) {
x = 0;
y = c / b;
g = abs(b);
return true;
}
return false;
}
if (b == 0) {
if (c % a == 0) {
x = c / a;
y = 0;
g = abs(a);
return true;
}
return false;
}
g = extgcd(a, b, x, y);
if (c % g != 0) {
return false;
}
T dx = c / a;
c -= dx * a;
T dy = c / b;
c -= dy * b;
x = dx + (T)((__int128)x * (c / g) % b);
y = dy + (T)((__int128)y * (c / g) % a);
g = abs(g);
return true;
// |x|, |y| <= max(|a|, |b|, |c|) [tested]
}
bool crt(long long k1, long long m1, long long k2, long long m2, long long &k,
long long &m) {
k1 %= m1;
if (k1 < 0)
k1 += m1;
k2 %= m2;
if (k2 < 0)
k2 += m2;
long long x, y, g;
if (!diophantine(m1, -m2, k2 - k1, x, y, g)) {
return false;
}
long long dx = m2 / g;
long long delta = x / dx - (x % dx < 0);
k = m1 * (x - dx * delta) + k1;
m = m1 / g * m2;
assert(0 <= k && k < m);
return true;
}
// for distinct prime modulos
template <typename T>
void crt_garner(const std::vector<int> &p, const std::vector<int> &a, T &res) {
assert(p.size() == a.size());
auto inverse = [&](int q, int m) {
q %= m;
if (q < 0)
q += m;
int b = m, u = 0, v = 1;
while (q) {
int t = b / q;
b -= t * q;
std::swap(q, b);
u -= t * v;
std::swap(u, v);
}
assert(b == 1);
if (u < 0)
u += m;
return u;
};
std::vector<int> x(p.size());
for (int i = 0; i < (int)p.size(); i++) {
assert(0 <= a[i] && a[i] < p[i]);
x[i] = a[i];
for (int j = 0; j < i; j++) {
x[i] = (int)((long long)(x[i] - x[j]) * inverse(p[j], p[i]) % p[i]);
if (x[i] < 0)
x[i] += p[i];
}
}
res = 0;
for (int i = (int)p.size() - 1; i >= 0; i--) {
res = res * p[i] + x[i];
}
}
const ll L = 1e9;
void solve() {
int64_t a, b;
cin >> a >> b;
int64_t beta1 = 1;
while (b % 2 == 0)
b /= 2, beta1 *= 2;
while (b % 5 == 0)
b /= 5, beta1 *= 5;
if (b == 1) {
cout << "0 1\n";
return;
}
a %= b;
int ansc = L, ansd = L;
for (int64_t beta2 = 1; beta2 * b <= L; beta2 *= 2)
for (int64_t beta3 = 1; beta2 * beta3 * b <= L; beta3 *= 5) {
int64_t v = (b - beta2 * beta3 % b * a % b) % b, x, y;
extgcd(beta1, b, x, y);
x = (v * x % b + b) % b, y = beta2 * beta3 * b;
int64_t gg = gcd(x, y);
x /= gg, y /= gg;
if (ansc > x)
ansc = x, ansd = y;
}
cout << ansc << ' ' << ansd << "\n";
return;
}
int main() {
int T;
cin >> T;
while (T--)
solve();
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3612kb
input:
4 1 2 2 3 3 7 19 79
output:
0 1 1 3 1 4375 3 316
result:
ok 4 case(s)
Test #2:
score: 0
Accepted
time: 78ms
memory: 3544kb
input:
10000 11 12 28 53 17 60 2 35 17 181 80 123 68 141 79 163 71 99 13 64 33 61 15 32 16 61 11 86 33 74 128 143 40 53 7 23 30 31 5 6 86 181 73 91 13 23 71 81 1 2 7 38 117 160 33 83 129 151 88 153 25 58 16 19 19 141 95 124 43 96 71 139 11 59 106 109 93 152 34 43 17 99 1 57 20 159 16 25 5 73 159 170 172 17...
output:
1 3 1 828125000 1 15 1 7 1 231680000 23 960937500 1 36096000 5 326 1 63360 0 1 1 61000 0 1 1 4880 1 10750 1 18500 1 11714560 1 331250 1 898437500 1 31 1 15 1 289600000 1 455000 1 115000000 1 1265625 0 1 1 1484375 0 1 1 415 1 235937500 1 765000000 1 181250 1 2968750 1 4406250 3 775 1 3 3 347500 1 944...
result:
ok 10000 case(s)
Test #3:
score: 0
Accepted
time: 83ms
memory: 3604kb
input:
10000 649 915 163 504 53 235 130 131 109 475 214 757 719 788 479 975 515 811 367 972 69 221 21 44 53 157 77 398 227 332 38 87 145 976 396 403 203 381 675 838 157 309 827 962 17 56 455 654 377 809 605 908 907 929 631 978 286 621 289 462 425 428 139 144 259 368 623 642 767 773 32 281 235 624 88 871 39...
output:
1 11712 1 630 1 11750000 1 131 1 95 9 19379200 1 15760 7 9750 33 129760000 1 199065600 1 3536 1 1375 2 98125 9 31840 1 66400 1 54375 1 38125000 4 31484375 1 952500000 9 838000 1 98880000 3 4925440 1 4375 1 638671875 17 2071040 1 2270000 4 2903125 7 1222500 31 12420000 17 288750 1 107000 1 45 1 115 1...
result:
ok 10000 case(s)
Test #4:
score: 0
Accepted
time: 46ms
memory: 3756kb
input:
10000 92916 121039 44812 49081 648307 724965 758916 780077 99256 205723 326746 382303 288096 996145 218860 951883 12801 35014 128665 169196 201524 298553 448151 688549 68962 180601 834591 924280 492975 701087 54245 64901 335012 440951 264723 555529 178065 246602 48529 77438 549077 578801 406123 4154...
output:
2207 774649600 2046 766890625 8323 1449930 21161 780077 2139 82289200 2301 244673920 4299 398458 7309 95188300 37 10941875 491 845980000 36866 186595625 94399 688549000 8011 288961600 239 1478848 36723 876358750 1047 8307328 2769 11023775 2725 71107712 2144 385315625 3413 619504000 15679 11576020 92...
result:
ok 10000 case(s)