おじさんの競プロ記録

自分の力で解答できた問題を振り返り、理解を深めたいです。

AtCoder Beginner Contest 186 C - Unlucky 7

問題

問題文へ

1以上N以下の整数のうち、10進法で表しても8進法で表しても7を含まないような数はいくつありますか?

制約

  • {1 \leqq N \leqq 10^5}
  • Nは整数である。

考えたこと

制約より、 10^5までならばすべてを確認しても間に合うと判断しました。8進法への変換方法は検索しました。

コード

#define _GIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(v) v.begin(), v.end()
using namespace std;
using ll = long long;


int main(void) {
  int N;
  cin >> N;

  int ans = 0;
  char s[100];
  for (int i = 1; i <= N; ++i) {
    sprintf(s, "%u%o", i, i);
    if (strchr(s, '7') == NULL) ++ans;
  }

  cout << ans << endl;
  
  return 0;
}

解説動画を見て

10で割った余りから10進法の一桁ずつ取得できます。8で割ればすむようです。基数を変えて応用ですね。

関数にせず、for(int base : (8, 10))で処理を分けるのはかっこいいです。