我的程序:
#include<bits/stdc++.h>
#define int64 long long
using namespace std;
int T,mu[70];
int main(){
scanf("%d",&T);
mu[1]=1;
for(int i=2;i<=60;i++)
for(int j=1;j<i;j++)if(i%j==0)mu[i]-=mu[j];
while(T--){
int64 x,ans=0;scanf("%lld",&x);
for(int i=1;i<=60;i++)
ans+=mu[i]*(int64)(__builtin_powl(x,1.l/i)+1e-16l);
printf("%lld\n",ans+1);
}
return 0;
}
自我感觉良好,但是WA on test 6.
然后下载数据,发现是这个鬼东西:
576460752303423487
输出了中间结果,都挺对的。肯定是精度的问题。
于是我使用python对拍了一下。python输出了CF上的正确答案。但是中间结果是这样的:
>>> x=576460752303423487
>>> print int(pow(x,1.0))
576460752303423488
所以我现在大胆猜想数据是错的