結果

問題 No.2262 Fractions
ユーザー chro_96chro_96
提出日時 2023-04-08 00:42:11
言語 C
(gcc 12.3.0)
結果
TLE  
実行時間 -
コード長 4,119 bytes
コンパイル時間 948 ms
コンパイル使用メモリ 31,676 KB
実行使用メモリ 10,624 KB
最終ジャッジ日時 2024-10-02 21:48:52
合計ジャッジ時間 26,333 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 TLE -
testcase_01 AC 188 ms
5,376 KB
testcase_02 AC 224 ms
5,376 KB
testcase_03 AC 237 ms
5,248 KB
testcase_04 AC 260 ms
5,376 KB
testcase_05 AC 242 ms
5,376 KB
testcase_06 AC 273 ms
5,376 KB
testcase_07 AC 263 ms
5,376 KB
testcase_08 AC 252 ms
5,376 KB
testcase_09 AC 280 ms
5,376 KB
testcase_10 AC 276 ms
5,376 KB
testcase_11 TLE -
testcase_12 TLE -
testcase_13 TLE -
testcase_14 TLE -
testcase_15 TLE -
testcase_16 AC 538 ms
5,248 KB
testcase_17 AC 536 ms
5,376 KB
testcase_18 AC 529 ms
5,376 KB
testcase_19 TLE -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
testcase_33 -- -
testcase_34 -- -
testcase_35 -- -
testcase_36 -- -
testcase_37 -- -
testcase_38 -- -
testcase_39 -- -
testcase_40 -- -
testcase_41 -- -
testcase_42 -- -
testcase_43 -- -
testcase_44 -- -
testcase_45 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <stdio.h>

int main () {
  int t = 0;
  
  int res = 0;
  
  int np[300001] = {};
  int nf[300001] = {};
  int pcnt[300001] = {};
  
  np[1] = 1;
  nf[1] = 1;
  for (int i = 2; i <= 300000; i++) {
    if (np[i] <= 0) {
      pcnt[i] = 1;
      for (int p = 2; i*p <= 300000; p++) {
        np[i*p] = 1;
        pcnt[i*p]++;
        if (p%i == 0) {
          nf[i*p] = 1;
        }
      }
    }
  }
  
  res = scanf("%d", &t);
  while (t > 0) {
    long long n = 0LL;
    long long k = 0LL;
    long long ans[2] = { 1LL, 0LL };
    long long l[2] = { 0LL, 1LL };
    res = scanf("%lld", &n);
    res = scanf("%lld", &k);
    while (l[0]+ans[0] <= n && l[1]+ans[1] <= n) {
      long long nxt[2] = { l[0]+ans[0], l[1]+ans[1] };
      long long cnt = 0LL;
      for (long long i = 1LL; i <= n; i += 1LL) {
        long long d = (nxt[0]*i)/nxt[1];
        if (d > n) {
          d = n;
        }
        cnt += d;
        if (nf[(int)i] <= 0) {
          long long tmp = 0LL;
          for (long long j = 1LL; i*j <= n; j += 1LL) {
            long long d = (nxt[0]*i*j)/nxt[1];
            if (d > n) {
              d = n;
            }
            tmp += d/i;
          }
          if (pcnt[(int)i]%2 == 0) {
            cnt += tmp;
          } else {
            cnt -= tmp;
          }
        }
      }
      /*if (cnt < k) {
        l[0] += ans[0];
        l[1] += ans[1];
      } else {
        ans[0] += l[0];
        ans[1] += l[1];
      }*/
      if (cnt < k) {
        long long t[2] = { 1LL, n };
        if (t[1] > (n-l[0])/ans[0]) {
          t[1] = (n-l[0])/ans[0];
        }
        if (ans[1] > 0LL && t[1] > (n-l[1])/ans[1]) {
          t[1] = (n-l[1])/ans[1];
        }
        t[1] += 1LL;
        while (t[1]-t[0] > 1LL) {
          long long nxt_v = (t[0]+t[1])/2LL;
          long long nxt[2] = { l[0]+nxt_v*ans[0], l[1]+nxt_v*ans[1] };
          long long cnt = 0LL;
          for (long long i = 1LL; i <= n; i += 1LL) {
            long long d = (nxt[0]*i)/nxt[1];
            if (d > n) {
              d = n;
            }
            cnt += d;
            if (nf[(int)i] <= 0) {
              long long tmp = 0LL;
              for (long long j = 1LL; i*j <= n; j += 1LL) {
                long long d = (nxt[0]*i*j)/nxt[1];
                if (d > n) {
                  d = n;
                }
                tmp += d/i;
              }
              if (pcnt[(int)i]%2 == 0) {
                cnt += tmp;
              } else {
                cnt -= tmp;
              }
            }
          }
          if (cnt < k) {
            t[0] = nxt_v;
          } else {
            t[1] = nxt_v;
          }
        }
        l[0] += t[0]*ans[0];
        l[1] += t[0]*ans[1];
      } else {
        long long t[2] = { 1LL, n };
        if (l[0] > 0LL && t[1] > (n-ans[0])/l[0]) {
          t[1] = (n-ans[0])/l[0];
        }
        if (t[1] > (n-ans[1])/l[1]) {
          t[1] = (n-ans[1])/l[1];
        }
        t[1] += 1LL;
        while (t[1]-t[0] > 1LL) {
          long long nxt_v = (t[0]+t[1])/2LL;
          long long nxt[2] = { nxt_v*l[0]+ans[0], nxt_v*l[1]+ans[1] };
          long long cnt = 0LL;
          for (long long i = 1LL; i <= n; i += 1LL) {
            long long d = (nxt[0]*i)/nxt[1];
            if (d > n) {
              d = n;
            }
            cnt += d;
            if (nf[(int)i] <= 0) {
              long long tmp = 0LL;
              for (long long j = 1LL; i*j <= n; j += 1LL) {
                long long d = (nxt[0]*i*j)/nxt[1];
                if (d > n) {
                  d = n;
                }
                tmp += d/i;
              }
              if (pcnt[(int)i]%2 == 0) {
                cnt += tmp;
              } else {
                cnt -= tmp;
              }
            }
          }
          if (cnt >= k) {
            t[0] = nxt_v;
          } else {
            t[1] = nxt_v;
          }
        }
        ans[0] += t[0]*l[0];
        ans[1] += t[0]*l[1];
      }
    }
    if (ans[1] == 0LL) {
      printf("-1\n");
    } else {
      printf("%lld/%lld\n", ans[0], ans[1]);
    }
    t--;
  }
  
  return 0;
}
0