欧拉函数

定义

欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。特殊的,φ(1)=1

计算通式

φ(x)=xi=0n(11pi)

φ(1)=1

其中p1,p2pn为x的所有质因数,x是正整数。

理解:对于x的一个质因数pi,因为x以内pi的倍数是均匀分布的,所以x以内有1pi的数是pi的倍数,那么有11pi的数不是pi的倍数,则有i=0n(11pi)的数与x互质。

欧拉函数的性质

  1. 质数p, φ(p)=p-1

  2. 质数p, 若n=pk,则φ(p)=pkpk1

代入计算通式易得

  1. 欧拉函数是积性函数,但不是完全积性函数。

由互质,计算通式相乘可以证明。

  1. 小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)

与n互质的数一个是m,那么还存在另一个数n-m也与n互质。所以与n互质的数的平均数是n/2,而个数又是φ(n),可以得到这些数的和就是φ(n)*n/2

  1. 当n>2时,φ(n)是偶数
  2. n=d|nφ(d) , 即n的因数(包括1和它自己)的欧拉函数之和等于n

求欧拉函数

以最坏时间复杂度 O(n) 内求得指定正整数的欧拉函数值。

int phi(int n)
{
int res = n;
for (int i = 2; i * i <= n; i++)
{
if (n % i == 0)
res = res / i * (i - 1); // 先除再乘防止溢出
while (n % i == 0) // 每个质因数只处理一次,可以把已经找到的质因数除干净
n /= i;
}
if (n > 1)
res = res / n * (n - 1); // 最后剩下的部分也是原来的n的质因数
return res;
}

在欧拉筛途中顺便求出

int cnt = 0;
bool vis[50004];
int prim[50004];
int phi[50004];
void sieve(int n)
{
vis[1] = 1;phi[1] = 1;
for(int i=2;i<=n;++i)
{
if(vis[i]==0){
prim[++cnt] = i;
phi[i] = i - 1;
}
for(int j=1;j<=cnt&&i*prim[j]<=n;++j)
{
vis[i*prim[j]] = 1;
if(i%prim[j]==0){
phi[i*prim[j]] = phi[i] * prim[j];
break;
}
else phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
}

题目

NC20313 SDOI2008仪仗队

积性函数

当m与n互质时,$f ( m \times n ) = f ( m ) \times f ( n ) ff(m\times n)=f(m)\times f(n)$成立,则f是完全积性函数。

posted @   HIVM  阅读(263)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示