如何求
∑n−1i=1gcd(i,n)——(1)
因为
gcd(i,n)
的值一定是
n
的因子,然后我们通过观察发现
∑d∗phi(nd),d∈{n的因子},去掉d是n的情况
,其中
phi(i): i的欧拉函数值
现在有一个假设,我们可以通过枚举
n
的因子,然后进行计算,因为
现在来考虑这样一个问题,我们将
代码如下:
void Get_phi()///筛法求欧拉函数
{
cnt = 0;
memset(flag, true, sizeof(flag));
phi[1] = 1;
for(int i=2; i<MAXN; i++)///线性筛法
{
if(flag[i])///素数
{
p[cnt++] = i;
phi[i] = i-1;///素数的欧拉函数值是素数 - 1
}
for(int j=0; j<cnt; j++)
{
if(i*p[j] > MAXN)
break;
flag[i*p[j]] = false;///素数的倍数,所以i*p[j]不是素数
if(i%p[j] == 0)///性质:i mod p == 0, 那么 phi(i * p) == p * phi(i)
{
phi[i*p[j]] = p[j] * phi[i];
break;
}
else
phi[i*p[j]] = (p[j]-1) * phi[i];///i mod p != 0, 那么 phi(i * p) == phi(i) * (p-1)
}
}
//求 ans[i] 的值
int tmp = sqrt(MAXN)+1;
for(int i=2; i<MAXN; i++) ans[i] = phi[i];
for(int i=2; i<=tmp; i++){
ans[i*i] += i*phi[i];
for(int j=i*(i+1), k=i+1; j<MAXN; j+=i, k++) ans[j] += i*phi[k] + k*phi[i];
}
}