Codeforces Round #471 (Div. 2) C - Sad powers / 院科技文化节初级组 E-翼神的幸运数字(筛)

题解

k=2的情况单独作差,完全平方数单独统计

k≠2的情况,其余为非完全平方数。

即a^(2*k+1)的情况统计去重。

统计非完全平方数的奇次方即可。

心得

二分的部分要自己写啊 统计<=x的最大下标 upper_bound-1会越界的吧

凯神的代码还是不错的吖 要好好学习吖

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

后续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值