QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#752175#9622. 有限小数kindowWA 255ms200308kbC++202.2kb2024-11-15 22:32:412024-11-15 22:32:41

Judging History

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

  • [2024-11-15 22:32:41]
  • 评测
  • 测评结果:WA
  • 用时:255ms
  • 内存:200308kb
  • [2024-11-15 22:32:41]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> prime;
vector<bool> is_not_prime(1e6 + 2);
vector<ll> fac(1e6 + 2);
vector<set<ll> > v(1e6 + 2);
vector<ll> phi(1e6 + 10);
ll qp(ll a, ll b, ll mod){
  ll z = 1;
  while(b){
    if(b & 1) z = z * a % mod;
    b >>= 1;
    a = a * a % mod;
  }
  return z;
}
void solve(){
  ll a, b;
  cin >> a >> b;
  ll curb = b;
  ll num2 = 0;
  ll num5 = 0;
  ll r = 1;
  while(curb % 2 == 0){
    curb /= 2;
    r *= 2ll;
    ++num2;
  }
  while(curb % 5 == 0){
    curb /= 5;
    ++num5;
    r *= 5ll;
  }
  ll b1 = b / r;
  vector<ll> p2(40);
  vector<ll> p5(40);
  p2[0] = p5[0] = 1;
  ll curc = 0x7fffffffff;
  ll curd = 0x7fffffffff;
  for(ll i = 1; i <= 31; ++i){
    p2[i] = p2[i - 1] * 2ll;
  }
  for(ll i = 1; i <= 13; ++i){
    p5[i] = p5[i - 1] * 5ll;
  }
  ll a1 = a / gcd(a, r);
  ll r1 = r / gcd(a, r);
  for(ll i = 0; i <= 31; ++i){
    for(ll j = 0; j <= 13; ++j){
      if(__int128_t(p2[i]) * __int128_t(p5[j]) * __int128_t(b1) > 1e9){
        continue;
      }
      ll cur = p2[i] * p5[j] % b1;
      ll rv = qp(r1, phi[b1], b1);
      ll now = a1 * cur % b1 * rv % b1;
      ll c = (-now + b1) % b1;
      ll d = p2[i] * p5[j] * b1;
      if(c <= curc){
        if(c == curc){
          curd = min(curd, d); 
        }
        else
          curd = d;
        curc = c;
      }
    }
  }
  cout << curc << ' ' << curd << '\n';
}

int main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  ll t;
  cin >> t;
  for(ll i = 2; i <= 1e6; i++){
    if(!is_not_prime[i]){
      prime.push_back(i);
      fac[i] = i;
    }
    for(ll j : prime){
      if(j * i > 1e6) break;
      is_not_prime[j * i] = true;
      fac[j * i] = j;
      if(i % j == 0) break;
    }
  }
  for(ll i = 2; i <= 1e6; ++i){
    ll val = i;
    while(val > 1){
      v[i].insert(fac[val]);
      val /= fac[val];
    }
  }
  phi[1] = 1;
  for(ll i = 2; i <= 1e6; ++i){
    ll cur = i;
    phi[i] = 1;
    for(auto j: v[i]){
      cur /= j;
      phi[i] *= j - 1;
    }
    phi[i] *= cur;
  }
  while(t--){
    solve();
  }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 183ms
memory: 200168kb

input:

4
1 2
2 3
3 7
19 79

output:

0 1
1 3
1 14
3 316

result:

ok 4 case(s)

Test #2:

score: -100
Wrong Answer
time: 255ms
memory: 200308kb

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 54272
1 3
1 70
1 231680000
23 3936
1 36096000
5 326
1 63360
0 1
1 31232
0 1
1 4880
1 5375
1 9250
1 11714560
1 331250
1 2944
1 31
1 3
1 289600000
1 455000
1 58880
1 51840
0 1
1 152
0 1
1 415
1 19328000
1 765000000
1 2320
1 608
1 72192
3 6200
1 6
3 347500
1 944
1 43600
1 190
1 430000
1 6336
1 29...

result:

wrong answer The result is not terminating.(Testcase 3)