P9118题解
题目传送门。
Update 2023/10/16 修改了代码和一些笔误。
思路
我们令
令
很容易得到
易知
所以
从后往前容斥即可。
当
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Maxn=110;
const double eps=1e-9;
ll f[Maxn],n,k,ans=1;
int main(){
scanf("%lld%lld",&n,&k);
for(ll i=100;i>=k;i--){
f[i]=pow<long double>(n,1.0/i)+eps-1;
for(ll j=i<<1;j<=100;j+=i) f[i]-=f[j];
ans+=f[i];
}
printf("%lld",ans);
return 0;
}