题解
k=2的情况单独作差,完全平方数单独统计
k≠2的情况,其余为非完全平方数。
即a^(2*k+1)的情况统计去重。
统计非完全平方数的奇次方即可。
心得
二分的部分要自己写啊 统计<=x的最大下标 upper_bound-1会越界的吧
凯神的代码还是不错的吖 要好好学习吖
代码
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define mod 1000000007
using namespace std;
typedef long long ll;
ll sz,q,L,R,pp[5000005],num=0;
bool is(ll x){
ll xx=sqrt(x);
return xx*xx==x;
}
ll cal(ll x)
{
if(x==0)return 0;
ll l=0,r=sz;
while(r-l>1){
ll m=(l+r)/2;
if(pp[m]<=x)l=m;//[0,l]里的数<=x [1,x]包含
else r=m;
}
return l+(ll)sqrt(x);
}
int main(){
//freopen("a1.in","r",stdin);
//freopen("a1.out","w",stdout);
pp[num++]=0;
for(ll a=2;a<=1000000;a++){
if(is(a))continue;//去掉完全平方数
ll ans=a;
while(ans<=1e18/a/a)//去掉非完全平方数的2k次方 即完全平方数的k次方 均为完全平方数
{
ans*=a*a;
pp[num++]=ans;
}
}
sort(pp,pp+num);
sz=unique(pp+1,pp+num)-pp;
cin>>q;
while(q--){
scanf("%lld%lld",&L,&R);
printf("%lld\n",cal(R)-cal(L-1));
}
return 0;
}