1 条题解

  • 1
    @ 2023-7-17 16:41:26

    image

    #include<bits/stdc++.h>
    #define ll long long 
    using namespace std;
    ll n,m,k,s,t,f[105],ans;
    ll qpow(ll a,ll b){//计算a的b次方 
    	ll tmp=1;
    	for (int i=1;i<=b;++i){
    		if (n/tmp<a) return n+1;
    		tmp*=a;
    	}
    	return tmp;
    }
    ll sq(ll n,ll k){//开方 
    	ll l=1,r=n,mid;
    	while (l<=r){
    		mid=(l+r)>>1;
    		if (qpow(mid,k)<=n) l=mid+1;
    		else r=mid-1;
    	}
    	return r;
    }
    int main(){
    	cin>>n>>k;
    	for (int i=100;i>=1;--i){
    		f[i]=sq(n,i)-1;//开方计算能用a^i表示的数的个数
    		for (int j=2*i;j<=100;j+=i) f[i]-=f[j];//依次减去能用a^2i,a^3i...表示的数
    	}
    	ans=n-1;
    	for (int i=1;i<k;++i) ans-=f[i];
    	cout<<ans+1;	
    }
    
    • 1

    信息

    ID
    297
    时间
    1000ms
    内存
    1024MiB
    难度
    3
    标签
    递交数
    50
    已通过
    28
    上传者