感觉可能是无符号的处理上挂掉了,但是不知道怎么处理。
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define endl '\n'
#define N 10000006
using namespace std;
int T,n,phi[N],p[N],isprime[N],tot;
ull sp[N];
unordered_map<int,ull> ansp;
void init()
{
phi[1]=1;
for(int i=2;i<=1e7;i++)
{
if(!isprime[i])p[++tot]=i,phi[i]=i-1;
for(int j=1;j<=tot&&p[j]*i<=1e7;j++)
{
isprime[p[j]*i]=1;
if(i%p[j]==0){phi[p[j]*i]=phi[i]*p[j];break;}
phi[p[j]*i]=phi[i]*phi[p[j]];
}
}
for(int i=1;i<=1e7;i++)sp[i]=sp[i-1]+1ull*phi[i];
}
ull getphi(int k)
{
if(k<=1e7)return sp[k];
if(ansp[k])return ansp[k];
ull ret=1ull*(k+1)*k/2;
for(int l=2,r;l<=k;l=r+1)
r=k/(k/l),ret-=getphi(k/l)*(r-l+1);
return ansp[k]=ret;
}
ull solve(int k)
{
if(k<=1)return 0ull;
return solve(k>>1)+getphi(k);
}
main()
{
scanf("%lld",&T),init();
while(T--)scanf("%lld",&n),printf("%llu\n",solve(n));
return 0;
}