BZOJ-2226 [Spoj 5971] LCMSum(欧拉函数的性质)
题目描述
计算:
\[\sum_{i=1}^{n}\text{lcm}(i,n)
\]
数据范围:\(1\leq T\leq 3\times 10^5,1\leq n\leq 10^6\)。
分析
\[\begin{aligned}&\sum_{i=1}^{n}\text{lcm}(i,n)\\=&\sum_{i=1}^{n}\frac{i·n}{\gcd(i,n)}\\=&n\sum_{i=1}^{n}\frac{i}{\gcd(i,n)}\\=&n\sum_{d\mid n}\sum_{i=1}^{n}\frac{i}{d}[\gcd(i,n)=d]\\\end{aligned}
\]
若 \(\gcd(i,n)=d\),则 \(i\) 肯定是 \(d\) 的倍数,设 \(i=i'd\),即:
\[\begin{aligned}&n\sum_{d\mid n}\sum_{i=1}^{n}\frac{i}{d}[\gcd(i,n)=d]\\=&n\sum_{d\mid n}\sum_{i'd=1}^{n}\frac{i'd}{d}[\gcd(i'd,n)=d]\\=&n\sum_{d\mid n}\sum_{i'=1}^{\lfloor\frac{n}{d}\rfloor}i'[\gcd(i',\frac{n}{d})=1]\\=&n\sum_{d\mid n}\sum_{i=1}^{d}i[\gcd(i,d)=1]\end{aligned}
\]
右边的和式表示 \(1\) ~ \(d\) 中所有与 \(d\) 互质的数字之和,值为 \(\frac{d·\varphi(d)}{2}\)(当 \(d=1\) 时,值为 \(1\))。
因此原式答案为:
\[n\sum_{d\mid n}\frac{d·\varphi(d)+[d=1]}{2}
\]
线性筛欧拉函数,枚举 \(d\),将 \(1\) ~ \(n\) 中所有 \(d\) 的倍数都加上 \(\frac{d·\varphi(d)}{2}\),时间复杂度 \(O(n\log n+T)\)。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long prime[N+10],phi[N+10],cnt,sum[N+10];
int vis[N+10];
void init()
{
phi[1]=1;
for(int i=2;i<=N;i++)
{
if(!vis[i])
{
prime[++cnt]=i;
phi[i]=i-1;
}
for(int j=1;j<=cnt&&i*prime[j]<=N;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
for(long long i=2;i<=N;i++)
for(long long j=i;j<=N;j=j+i)
sum[j]=sum[j]+i*phi[i]/2;
}
int main()
{
init();
int T;
cin>>T;
while(T--)
{
int n;
scanf("%d",&n);
printf("%lld\n",n*(sum[n]+1));
}
return 0;
}
posted on 2020-11-24 20:47 DestinHistoire 阅读(68) 评论(0) 收藏 举报
浙公网安备 33010602011771号