結果
| 問題 | No.2177 Recurring ab | 
| コンテスト | |
| ユーザー |  tnakao0123 | 
| 提出日時 | 2023-01-08 21:57:19 | 
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 2 ms / 2,000 ms | 
| コード長 | 1,187 bytes | 
| コンパイル時間 | 387 ms | 
| コンパイル使用メモリ | 41,796 KB | 
| 実行使用メモリ | 5,248 KB | 
| 最終ジャッジ日時 | 2024-12-16 01:45:44 | 
| 合計ジャッジ時間 | 1,454 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 18 | 
ソースコード
/* -*- 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;
}
            
            
            
        