Codeforces Round #471 (Div. 2) C. Sad powers
阿新 • • 發佈:2018-12-01
題意:問區間[L, R]中有多少數字可以寫成的形式;
思路::當p>=3時,x<=1e6;只有p=2時x能達到1e9;但是[L, R]區間中滿足的數有(int)sqrt(R)-(int)sqrt(L-1)個,所以對於區間[L, R]先找出p>=3的情況,再加上(int)sqrt(R)-(int)sqrt(L-1),而對於p>=3的情況打表找出來就可以了,然後排序,二分查詢;
#include <bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> vec; ll power(int j, int i){ ll ret=1LL; while(i){ ret*=(ll)j; if(ret>2e18||ret<0) return ret; i--; } return ret; } void init(){ for(int i=3; i<=64; i++){ int j; for( j=2; ; j++){ ll temp=power(j, i); if(temp>2e18||temp<0) break; ll x=(ll)sqrt(temp); if(x*x==temp) continue; vec.push_back(temp); } } sort(vec.begin(), vec.end()); unique(vec.begin(), vec.end())-vec.begin(); } int main(){ init(); int Q; scanf("%d", &Q); while(Q--){ ll L, R; scanf("%lld%lld", &L, &R); ll ans=upper_bound(vec.begin(), vec.end(), R)-lower_bound(vec.begin(), vec.end(), L); ans+=(ll)sqrt(R)-(ll)sqrt(L-1); printf("%lld\n", ans); } return 0; }