結果
| 問題 |
No.2262 Fractions
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-04-07 23:36:44 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,745 bytes |
| コンパイル時間 | 2,107 ms |
| コンパイル使用メモリ | 197,948 KB |
| 最終ジャッジ日時 | 2025-02-12 03:05:34 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 1 |
| other | AC * 2 WA * 21 TLE * 22 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main () {
int T;
cin >> T;
vector<vector<int>> X(300030);
for (int i = 1; i <= 300000; i ++) {
for (int j = 1; i * j <= 300000; j ++) {
X[i * j].push_back(i);
}
}
int meb[300030];
fill(meb, meb + 300030, -2);
meb[1] = 1;
for (int i = 2; i <= 300000; i ++) {
if (meb[i] == -2) {
meb[i] = -1;
}
for (int j = 2; i * j <= 300000; j ++) {
meb[i * j] *= -1;
if (j % i == 0) {
meb[i * j] = 0;
}
}
}
while (T --) {
ll N, K;
cin >> N >> K;
if (N == 1) {
puts("1/1");
continue;
}
double l = 0, r = N + 1;
bool ok = false;
while(true) {
double mu = (l + r) / 2;
ll sum = 0;
for (ll m = 1; m <= N; m ++) {
ll n = min(N, (ll)(mu * m));
for (auto a : X[m]) {
sum += (n / a) * meb[a];
}
}
if (sum <= K) {
l = mu;
} else {
r = mu;
}
if (sum == K) {
ok = true;
break;
}
if (l > N) {
break;
}
}
if (ok) {
ll s = 0, b = 1;
for (ll m = 1; m <= N; m ++) {
ll a = (ll)(m * l);
a = min(a, N);
if (b * a >= m * s) {
s = a; b = m;
}
}
printf("%lld/%lld\n", s, b);
} else {
puts("-1");
}
}
}