求调abc361F
查看原帖
求调abc361F
530349
天空即为极限楼主2024/7/6 22:04
#include <bits/stdc++.h>
#define int long long
using namespace std;

int R[60] = { 0, 0, 1000000000, 1000000, 31622, 3981, 1000, 372, 177, 100, 63, 43, 31, 24, 19, 15, 13, 11, 10, 8, 7, 7, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 };
int H[60];
int P[17] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59 };

int qpow ( int x, int p ) {
  int res = 1;
  while ( p ) {
    if ( p & 1 ) res = res * x;
    x = x * x;
    p >>= 1;
  }
  return res;
}

signed main ( ) {
  int n; cin >> n;
  for ( int i = 2; i <= 59; i ++ ) {
    int l = 0, r = R[i] + 1;
    while ( l + 1 < r ) {
      int mid = l + r >> 1;
      if ( qpow ( mid, i ) <= n ) l = mid;
      else r = mid;
    }
    H[i] = l;
  }
  int ans = 0;
  for ( int i = 1; i < ( 1 << 17 ); i ++ ) {
    int ok = 1, res = 1;
    for ( int j = 0; j < 17; j ++ )
      if ( ( i >> j ) & 1 ) {
        res = res * P[j];
        if ( res > 59 ) { ok = 0; break;}
      } 
    if ( ok == 0 ) break;
    ans += ( ( __builtin_popcount ( i ) & 1 ) ? 1 : -1 ) * H[res];
  }
  cout << ans + 1 << "\n";
}
2024/7/6 22:04
加载中...