前言
算法基础课第四章 数学知识(二)
共7题,知识点如下
欧拉函数
AcWing 873. 欧拉函数
AcWing 874. 筛法求欧拉函数
快速幂
AcWing 875. 快速幂
AcWing 876. 快速幂求逆元
扩展欧几里得算法
AcWing 877. 扩展欧几里得算法
AcWing 878. 线性同余方程
中国剩余定理
AcWing 204. 表达整数的奇怪方式
欧拉函数
时间复杂度O(根号n)
瓶颈在分解质因数上
加上4个相乘的
减去5个相乘的
···
用容斥原理算出来的,两个式子等价,
比如,先把N提出来, (1 / p1)
的系数是-1,(1 / p1p2)
的系数是正1
模板——求欧拉函数
int phi(int x)
{
int res = x;
for (int i = 2; i <= x / i; 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;
}
AcWing 873. 欧拉函数
该题时间复杂度是n*根号ai
用定义直接求每个数的欧拉函数
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
while (n --) {
int a;
cin >> a;
int res = a;
// 分解质因数,分解完直接套公式即可
for (int i = 2; i <= a / i; i ++) {
if (a % i == 0) {
// 能整除说明i是a的一个质因子
// res = res / 1 * (1 / a); 不能有小数, 下面式子与这个等价
res = res / i * (i - 1);
while (a % i == 0) a /= i; // 把i除干净
}
}
// 满足说明a有一个大的质因子,将其也除去
if (a > 1) res = res / a * (a - 1);
cout << res << endl;
}
return 0;
}
欧拉函数的用法其实就是后面有个欧拉定理
待会会讲欧拉函数的证明
定义成函数,分开写
#include <iostream>
using namespace std;
int phi(int x)
{
int res = x;
for (int i = 2; i <= x / i; 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 main()
{
int n;
cin >> n;
while (n -- )
{
int x;
cin >> x;
cout << phi(x) << endl;
}
return 0;
}
欧拉函数记住公式,知道推导是容斥原理即可
模板——筛法求欧拉函数
int primes[N], cnt; // primes[]存储所有素数
int euler[N