おじさんの競プロ記録

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

キャディプログラミングコンテスト2021(AtCoder Beginner Contest 193) C - Unexpressed

問題

問題文へ

整数Nが与えられます。1以上N以下の整数のうち、2以上の整数a,bを用いてa^bと表せないものはいくつあるでしょうか?

制約

  • Nは整数
  •  1 \leq N \leq 10^{10}

考えたこと

bは2以上なので、10^{5*2}まで調べればよいです。

コード

#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) {
    ll n;
    cin >> n;

    set<ll> st;
    for (ll a = 2; a <= 100000; ++a) {
        ll num = a;
        num *= a;
        while (num <= n) {
            st.insert(num);
            num *= a;
        }
    }

    cout << n - st.size() << endl;
    
    return 0;
}

解説を読んで

a * a <= Nって書けばよかったです。