院科技文化节初级组 E-翼神的幸运数字(数学)

题解

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;
}

猜你喜欢

转载自blog.csdn.net/Code92007/article/details/84764329