数论补完计划 Part3 欧拉函数
欧拉函数
欧拉函数
如果
证明:
正难则反,考虑用
因为每个大于
但是有一个小问题——如果 小学奥数题):
假设被
特别的,形如上例问题的结果可以用以下公式算出:
因此我们在欧拉函数的计算中,也可以引入容斥原理。我们需要加上能被任意两个不同质数之积整除的数的个数,再减去能同时被三个不同质数之积整除的,以此类推。最终经过一些奇妙的化简(或者根本就是猜了一个结果然后拆括号检验的,正难则反懂不懂),得到如下计算公式:
代码实现时,通常把
int eular(int x) { int res = x; for (int i = 2; i * i <= x; i++) { if (x % i == 0) { res = res / i * (i - 1); while (x % i == 0) x /= i; } } if (x > 1) res = res / x * (x - 1); return res;}欧拉函数的递推
本质是在筛质数的过程中顺便维护一定区间内的数的欧拉函数值,这就需要用到欧拉函数作为积性函数的性质了。
线性筛/埃氏筛在筛质数的过程中,有一步是标记掉质数的所有倍数,根据算术基本定理,所有合数都可以被如此标记掉。假如当前在筛
int phi[N], primes[N];bool st[N];int idx = 0;
void sieve(int lim) { phi[1] = 1; for (int i = 2; i <= lim; i++) { if (!st[i]) { primes[++idx] = i; phi[i] = i - 1; } st[i] = true; for (int j = 1; i * primes[j] <= lim; j++) { phi[i * primes[j]] = phi[i] * (primes[j] - 1); st[i * primes[j]] = true; if (i % primes[j] == 0) { phi[i * primes[j]] = phi[i] * primes[j]; break; } } }}欧拉函数的实例
一个排列整齐的点阵,请问从某个角看去,视野内总共有多少个点?(不包括自己)
观察可得,图是有对称性的。那么沿对角线划分成上下两个对称的部分,对于两个点
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
部分内容可能已过时
