题意
求 ∑ni=1g(i),g(i)=2f(k),f(k) 为 k 的不同质因子个数。
=∑ni=1∑k|iμ2(k)
=∑ni=1μ2(i)⌊ni2⌋
因为
μ2(n)=∑n√i=1μ(i)⌊ni2⌋
令 f(n)=∑nk=1⌊nk⌋
有 Ans=∑n√i=1μ(i)f(⌊ni2⌋)
当
n
比较小时,可以记忆化
#include <cstdio>
#define N 1000010
#define P 1000000007
typedef long long ll;
int mu[N],t;
ll p[N],f[N],n,res;
inline ll S(ll x){
if(x<N-10) if(f[x]) return f[x];
ll A=0;
for(ll i=1,j;i<=x;i=j+1)j=x/(x/i),(A+=x/i*(j-i+1)%P)%=P;
if(x<N-10) f[x]=A;
return A;
}
inline void first(int x){
mu[1]=1;
for(int i=2;i<=x;i++){
if(!p[i]) p[++p[0]]=i,mu[i]=-1;
for(int j=1;i*p[j]<=x&&j<=p[0];j++)
if(p[i*p[j]]=1,i%p[j]) mu[i*p[j]]=-mu[i];
else {mu[i*p[j]]=0;break;}
}
}
int main(){
first(1000000);
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%lld",&n);
res=0;
for(int j=1;j<=n/j;j++)
if(mu[j])(res+=mu[j]*S(n/j/j)%P)%=P;
printf("Case #%d: %lld\n",i,(res+P)%P);
}
return 0;
}