結果

問題 No.2177 Recurring ab
ユーザー tnakao0123tnakao0123
提出日時 2023-01-08 21:57:19
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 1,187 bytes
コンパイル時間 245 ms
コンパイル使用メモリ 41,984 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-05-09 12:39:31
合計ジャッジ時間 1,156 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,816 KB
testcase_01 AC 1 ms
6,944 KB
testcase_02 AC 2 ms
6,940 KB
testcase_03 AC 2 ms
6,944 KB
testcase_04 AC 2 ms
6,944 KB
testcase_05 AC 2 ms
6,944 KB
testcase_06 AC 2 ms
6,940 KB
testcase_07 AC 2 ms
6,940 KB
testcase_08 AC 2 ms
6,944 KB
testcase_09 AC 1 ms
6,940 KB
testcase_10 AC 1 ms
6,944 KB
testcase_11 AC 2 ms
6,940 KB
testcase_12 AC 2 ms
6,944 KB
testcase_13 AC 2 ms
6,940 KB
testcase_14 AC 2 ms
6,940 KB
testcase_15 AC 2 ms
6,940 KB
testcase_16 AC 2 ms
6,940 KB
testcase_17 AC 2 ms
6,940 KB
testcase_18 AC 2 ms
6,940 KB
testcase_19 AC 2 ms
6,940 KB
testcase_20 AC 2 ms
6,940 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

/* -*- coding: utf-8 -*-
 *
 * 2177.cc:  No.2177 Recurring ab - yukicoder
 */

#include<cstdio>
#include<algorithm>
 
using namespace std;

/* constant */

const int MAX_N = 100;
const int MAX_P = 1000000000;

/* typedef */

typedef long long ll;

/* global variables */

/* subroutines */

inline ll fp(int p, int na, int nb) {
  return (ll)p * p - (ll)na * p - nb;
}

/* main */

int main() {
  int n;
  scanf("%d", &n);

  // x=0.abab...[p]
  // (p^2)x=ab.abab.. -> (p^2-1)x=pa+b -> x=(pa+b)/(p^2-1)
  // x > 1/N -> Nx > 1 -> N{(pa+b)/(p^2-1)} > 1 -> N(pa+b) > p^2-1
  // -> N(pa+b)+1>p^2 -> N(pa+b)>=p^2 -> p^2-Nap-Nb<=0

  ll sum = 0;
  for (int a = 0; a <= 9; a++)
    for (int b = 0; b <= 9; b++) {
      if (a == b) continue;

      int na = n * a, nb = n * b;

      int r0 = na / 2, r1 = MAX_P + 1;
      while (r0 + 1 < r1) {
	int r = (r0 + r1) / 2;
	if (fp(r, na, nb) <= 0) r0 = r;
	else r1 = r;
      }

      int l0 = max(a, b), l1 = na / 2;
      while (l0 + 1 < l1) {
	int l = (l0 + l1) / 2;
	if (fp(l, na, nb) <= 0) l1 = l;
	else l0 = l;
      }
      //printf("l0=%d, r0=%d\n", l0, r0);

      if (l0 < r0) sum += r0 - l0;
    }

  printf("%lld\n", sum);
  return 0;
}
0