天天看點

HDU2204 Eddy's愛好

題目連結:​​傳送門​​

求小于等于的數中能表示成的數的個數

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define
#define

using namespace std;
typedef long long ll;
ll pri[17] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59};
ll n;
ll calc(ll a) {
  return pow(n, 1.0 / a) - 1;
}

int main(int argc, char const *argv[]) {
  while (cin >> n) {
    ll c1 = 0, c2 = 0, c3 = 0;
    for (int i = 0; i < 17; i++) c1 += calc(pri[i]);
    for (int i = 0; i < 17; i++)
      for (int j = i + 1; j < 17; j++)
        c2 += calc(pri[i] * pri[j]);
    for (int i = 0; i < 17; i++)
      for (int j = i + 1; j < 17; j++)
        for (int k = j + 1; k < 17; k++)
          c3 += calc(pri[i] * pri[j] * pri[k]);
    cout << c1 - c2 + c3 + 1 << endl;
  }
}