Description
求f(n)=∑i=1n∑j=1i⌈ij⌉[(i,j)=1]
Input
多组用例,每组用例输入一整数n,以文件尾结束
Output
对于每组用例,输出f(n),结果模109+7
Sample Input
1
2
3
10
Sample Output
1
3
8
110
Solution
令g(n)======∑i=1n⌈ni⌉[(i,n)=1]∑i=1n⌊ni⌋[(i,n)=1]+ϕ(n)−1∑i=1n⌊ni⌋∑d|(i,n)μ(d)+ϕ(n)−1∑d|nμ(d)∑i=1n/d⌊n/di⌋+ϕ(n)−1∑d|nμ(nd)∑i=1d⌊di⌋+ϕ(n)−1∑d|nμ(nd)Sum(d)+ϕ(n)−1
其中Sum(n)=∑i=1n⌊ni⌋=∑i=1nd(i),d(n)是n的正因子数目
ϕ,μ,d都是积性函数,线性筛得到ϕ,μ,d,枚举i和
Code
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 1000005
#define mod 1000000007
typedef long long ll;
int prime[maxn],mu[maxn],euler[maxn],res,d[maxn],temp[maxn];
void Moblus(int n=1000000)
{
mu[1]=euler[1]=d[1]=1;
res=0;
for(int i=2;i<=n;i++)
{
if(!temp[i])
{
prime[res++]=i;
mu[i]=-1;
euler[i]=i-1;
temp[i]=i;
d[i]=2;
}
for(int j=0;j<res&&i*prime[j]<=n;j++)
{
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
euler[prime[j]*i]=euler[i]*prime[j];
temp[i*prime[j]]=temp[i]*prime[j];
d[i*prime[j]]=d[i/temp[i]]*(d[temp[i]]+1);
break;
}
mu[i*prime[j]]=-mu[i];
euler[prime[j]*i]=euler[i]*(prime[j]-1);
temp[i*prime[j]]=prime[j];
d[i*prime[j]]=2*d[i];
}
}
}
void inc(int &x,int y)
{
x=x+y>=mod?x+y-mod:x+y;
}
void dec(int &x,int y)
{
x=x-y<0?x-y+mod:x-y;
}
int ans[maxn];
void init(int n=1000000)
{
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j+=i)
if(mu[j/i]==-1)dec(ans[j],d[i]);
else if(mu[j/i]==1)inc(ans[j],d[i]);
for(int i=1;i<=n;i++)
inc(ans[i],euler[i]),dec(ans[i],1),inc(ans[i],ans[i-1]);
}
int main()
{
Moblus();
for(int i=2;i<=1000000;i++)d[i]+=d[i-1];
init();
int n;
while(~scanf("%d",&n))
printf("%d\n",ans[n]);
return 0;
}