QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#737507#9622. 有限小数isaunoyaAC ✓83ms3756kbC++234.8kb2024-11-12 16:01:302024-11-12 16:01:40

Judging History

你现在查看的是最新测评结果

  • [2024-11-12 16:01:40]
  • 评测
  • 测评结果:AC
  • 用时:83ms
  • 内存:3756kb
  • [2024-11-12 16:01:30]
  • 提交

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)