院科技文化節初級組 E-翼神的幸運數字(數學)
阿新 • • 發佈:2018-12-05
題解
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; }