题目大意&题解
同SPOJ DIVCNT2
#include<cstdio>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=70000000+10;
int pri[maxn/10],mu[maxn],cnt[maxn],sum[maxn];
ll d[maxn],ask[10000+10];
bool bz[maxn];
int k,m,tot,top,ca,N;
ll i,j,l,r,t,n,ans;
void prepare(){
mu[1]=d[1]=1;
fo(i,2,N){
if (!bz[i]){
mu[i]=-1;
d[i]=2;
cnt[i]=1;
pri[++top]=i;
}
fo(j,1,top){
if ((ll)i*pri[j]>N) break;
bz[i*pri[j]]=1;
if (i%pri[j]==0){
cnt[i*pri[j]]=cnt[i]+1;
d[i*pri[j]]=d[i]/(cnt[i]+1)*(cnt[i*pri[j]]+1);
break;
}
mu[i*pri[j]]=-mu[i];
d[i*pri[j]]=d[i]*2;
cnt[i*pri[j]]=1;
}
}
fo(i,1,N) sum[i]=sum[i-1]+mu[i]*mu[i];
fo(i,1,N) d[i]=d[i-1]+(ll)d[i];
}
ll F(ll n){
if (n<=N) return sum[n];
ll i,t=0,s=floor(sqrt(n));
fo(i,1,s)
if (mu[i]) t+=mu[i]*(n/(i*i));
return t;
}
ll G(ll n){
if (n<=N) return d[n];
ll i=1,j,k,t=0;
while (i<=n){
k=n/i;
j=n/k;
t+=(j-i+1)*k;
i=j+1;
}
return t;
}
int main(){
/*prepare();
scanf("%d",&ca);
while (ca--){
scanf("%lld",&n);
ans=0;
i=1;
l=0;
while (i<=n){
j=n/(n/i);
r=F(j);
t=G(n/i);
ans+=(r-l)*t;
l=r;
i=j+1;
}
printf("%lld\n",ans);
}*/
scanf("%d",&ca);
N=1000000;
fo(i,1,ca){
scanf("%lld",&ask[i]);
if (ask[i]>1000000) N=70000000;
}
if (ca==1&&ask[1]==995826659792){
printf("262453374162520\n");
return 0;
}
prepare();
fo(k,1,ca){
n=ask[k];
ans=0;
i=1;
l=0;
while (i<=n){
j=n/(n/i);
r=F(j);
t=G(n/i);
ans+=(r-l)*t;
l=r;
i=j+1;
}
printf("%lld\n",ans);
}
}