QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#744611 | #9622. 有限小数 | Rosmontispes | TL | 1ms | 3584kb | C++20 | 2.2kb | 2024-11-13 22:37:29 | 2024-11-13 22:37:29 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define int long long
array<int, 3> exgcd(int a, int b, array<int, 4> x = {1, 0, 0, 1}) {
for (int c; b; tie(a, b) = pair(b, a % b)) {
c = a / b, x = {x[2], x[3], x[0] - x[2] * c, x[1] - x[3] * c};
}
return {x[0], x[1], a};
}
array<int, 3> LiEu(int a, int b, int n = 1, int t = 0) {
auto [x, y, d] = exgcd(a, b);
if (n % d) return {x, y, 0};
t = abs(b) / d, x = ((n / d * x) % t + t) % t;
return {x, (n - a * x) / b, d};
}
void QAQ() {
int a, b;
cin >> a >> b;
int ta = a, tb = b;
int d = __gcd(a, b);
a /= d, b /= d;
int cnt2 = 0, cnt5 = 0;
for ( ; ; ) {
if (ta % 2 && ta % 5) break;
cnt2 += ta % 2 == 0;
cnt5 += ta % 5 == 0;
if (ta % 2 == 0) ta /= 2;
if (ta % 5 == 0) ta /= 5;
}
for ( ; ; ) {
if (tb % 2 && tb % 5) break;
cnt2 -= tb % 2 == 0;
cnt5 -= tb % 5 == 0;
if (tb % 2 == 0) tb /= 2;
if (tb % 5 == 0) tb /= 5;
}
array<int, 2> ans = {numeric_limits<int>::max(), -1};
for (int now = 1; now <= 1000000000; now <<= 1) {
for (int t = now; t <= 1000000000; t *= 5) {
int d = t * tb;
int gd = __gcd(d, b);
auto [c, tt, _] = LiEu(b, tb * b, -a * d);
if (_ == 0) continue;
int tmp = (tb * b) / _;
auto F = [&](int c, int tt, int cnt, int op) {
for (int i = 0; i <= cnt + 1; i++) {
if (c < 0 || tt > 0) continue;
int _ = __gcd(c, d);
int tc = c / _, td = d / _;
if (tc >= 0 && tc < ans[0] && tc <= 1000000000 && td <= 1000000000) {
ans = {tc, td};
}
c -= op * tmp, tt += op * tmp;
}
};
F(c, tt, _, 1), F(c, tt, _, -1);
}
}
cout << ans[0] << " " << ans[1] << "\n";
}
signed main() {
cin.tie(0) -> sync_with_stdio(0);
int t = 1;
cin >> t;
for (cout << fixed << setprecision(12); t--; QAQ());
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 3584kb
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: -100
Time Limit Exceeded
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 12 1 828125000 1 60 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 6 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 48 3 347500 1 94...