分解质因数的含义
每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。如30=2×3×5 。分解质因数只针对合数。
算法描述
从2开始枚举能够整除的质数,直到 i ∗ i < = n i*i<=n i∗i<=n(注意 n n n一直在变)时,表示不能被素数整除了,这时变量 n n n保存的数字就是最后一个质因数。
时间复杂度为 O ( n ) O(\sqrt{n}) O(n)
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
const int N = 1e5 + 5;
typedef long long ll;
#define debug(x) cout << #x << " = " << x << endl
ll factor[N];
int resolve(ll n)//分解质因数
{
int cnt = 0;
for (ll i = 2; i * i <= n; i++)
if (n % i == 0)
for ( ; n % i == 0; n /= i)
factor[cnt++] = i;
if (n != 1)
factor[cnt++] = n;
return cnt;
}
int main(void)
{
int n;
cin >> n;
int cnt = resolve(n);
debug(cnt);
for (int i = 0; i < cnt; i++)
cout << factor[i] << endl;
return 0;
}
欧拉函数
φ ( m ) = \varphi(m)= φ(m)=不超过 m m m并且和 m m m互素的数的个数
对于和 m m m互素的 x x x,有
x φ ( m ) ≡ 1 ( m o d m ) x^{\varphi(m)}≡1~(mod~m) xφ(m)≡1 (mod m)
等价为 x ∗ x φ ( m ) − 1 ≡ 1 ( m o d m ) x*x^{\varphi(m)-1}≡1~(mod~m) x∗xφ(m)−1≡1 (mod m)
根据逆元的定义式,可得
x − 1 ≡ x φ ( m ) − 1 ( m o d m ) x^{-1}≡x^{\varphi(m)-1}~(mod~m) x−1≡xφ(m)−1 (mod m)
求解 φ ( n ) \varphi(n) φ(n)的时间复杂度为 O ( n ) O(\sqrt n) O(n),求出 φ ( n ) \varphi(n) φ(n)后可以利用快速幂来求出逆元
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll euler_phi(ll n)
{
ll res = n;
for (ll i = 2; i * i <= n; i++){
if (n % i == 0){
res = res / i * (i - 1);
for ( ; n % i == 0; n /= i);
}
}
if (n != 1)
res = res / n * (n - 1);
return res;
}
int main(void)
{
int n;
cin >> n;
int ans = euler_phi(n);
cout << ans << endl;
return 0;
}