质因数的定义:这个数是因数且这个数是质数。
#include <iostream>
using namespace std;
int m;
int main()
{
cin >> m;
while(m--)
{
int n;
cin >> n;
枚举因数,枚举到根号n就行了,因为只有可能有一个大于根号n的质因数
i一定都是质数,因为i的倍数如果是n的因数,应该在第二个循环里面被除干净了
for(int i = 2; i <= n / i; i++)
{
if(n % i == 0)判断这是一个因数,由于i一定是质数,所以代表当i是质因数的时候
{
int s = 0;数这个因数的指数
while(n % i == 0) s++, n /= i;除多少次就证明有多少次
cout<< i << " " << s << endl;打印一个质因数和这个质因数的指数
}
}
if(n > 1) cout<< n << " " << 1 << endl;如果存在一个大于根号n的质因数,就打印出来
cout << endl;
}
}
首先解释一下欧拉函数是什么。对于正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目,记作φ(n).
比如:φ(1) = 1, φ(9) =6,分别是1,2,4,5,7,8.因为这些数和9是互质的。
计算欧拉函数的值的步骤为:
- 先找出n的质因数,比如9的质因数是3.(质因数的概念是:这个数是n的因数且这个数是质数)
- 带入公式n∗∏i=1x(1−1pi), 9 * (1 - 1/3)= 6,因此欧拉函数9的值是6
pi指的是质因数
对应的代码模板:
int a;
cin >> a;
int res = a;
//i全部都是质数
for(int i = 2; i <= a / i; i++)
{
if(a % i == 0)
{
res = res - res / i; 就是公式的res *= (1 - 1 / i)
while(a % i == 0) a /= i; 保证i全部都是质数的原因,因为除干净了
}
}
if(a > 1) res = res - res / a; 把最后一个质因数再乘进来
一道欧拉函数的例题:
**很明显题目就是要我们求从1到n的所有欧拉函数的和。**我们再回顾一下欧拉函数的定义:一个数的所有比它小且和它互质的数的个数。
当b = n的时候,gcd(a,b)=1也就是a和b互质,满足a和b互质的所有数就是欧拉函数(b)的值。