#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const ll mod=1e9+7;
int sum[maxn];
/
bool check[maxn];
int mu[maxn],prime[maxn],cnt[maxn],d[maxn],tot;
void Moblus()
{
memset(check,false,sizeof(check));
mu[1]=d[1]=1;
for(int i=2;i<=maxn;i++)
{
if(!check[i])
{
prime[tot++]=i;
mu[i]=-1;
d[i]=2;
cnt[i]=1;
}
for(int j=0;j<tot;j++)
{
if(i*prime[j]>maxn)
break;
check[i*prime[j]]=true;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
cnt[i*prime[j]]=cnt[i]+1;
d[i*prime[j]]=d[i]/(cnt[i]+1)*(cnt[i]+2);
break;
}
mu[i*prime[j]]=-mu[i];
cnt[i*prime[j]]=1;
d[i*prime[j]]=d[i]<<1;
}
}
///
sum[1]=1;
for(int i=2;i<maxn;i++)
sum[i]=(sum[i-1]+d[i-1]+1)%mod;
for(int i=1;i<maxn;i++)
{
sum[i]=(sum[i]+sum[i-1])%mod;
mu[i]=(mu[i]+mu[i-1])%mod;
}
//
}
/
int main()
{
int n,i,j;
Moblus();
ll ans=0;
while(scanf("%d",&n)!=EOF)
{
for(i=1,ans=0;i<=n;i=j+1)
{
j=n/(n/i);
ans=(ans+(mu[j]-mu[i-1]+mod)%mod*sum[n/i]%mod)%mod;
}
printf("%lld\n",ans);
}
return 0;
}
hdu 6134 素数打表一整套mark
最新推荐文章于 2018-08-27 15:41:11 发布