1. 程式人生 > >院科技文化節初級組 E-翼神的幸運數字(數學)

院科技文化節初級組 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;
}