📜  一个数除以其他数的最高幂 |套装 – 2(1)

📅  最后修改于: 2023-12-03 15:06:09.574000             🧑  作者: Mango

一个数除以其他数的最高幂 |套装 – 2

这个主题涉及到了的一些算法和技巧,包括但不限于质数筛、质因数分解和数学思维等方面,对于程序员来说是一个很有挑战性和收获的话题。

质数筛

质数筛是一种快速且常用的找出所有质数的方法,常见的有欧拉筛、埃氏筛和线性筛等算法。

埃氏筛

埃氏筛是一种最基础、最简单的质数筛法,思路简单易懂。

int prime[SIZE], cnt;
bool vis[SIZE];
void eratosthenes(int n){
    for(int i = 2; i <= n; i++){
        if(!vis[i]){
            prime[cnt++] = i;
            for(int j = i * i; j <= n; j += i){
                vis[j] = true;
            }
        }
    }
}

欧拉筛

欧拉筛是一种高效的质数筛法,采用了线性筛改进的思路,能够在时间复杂度 $O(n)$ 的情况下找出小于等于 $n$ 的所有质数。

int prime[SIZE], cnt;
bool vis[SIZE];
void euler(int n){
    for(int i = 2; i <= n; i++){
        if(!vis[i]){
            prime[cnt++] = i;
        }
        for(int j = 0; j < cnt && i * prime[j] <= n; j++){
            vis[i * prime[j]] = true;
            if(i % prime[j] == 0) break;
        }
    }
}
质因数分解

质因数分解是将一个正整数分解为若干个质数的乘积的过程,是数论中的一种基本算法,能够在数据处理、密码学等领域广泛应用。以下是 C++ 中的代码实现。

vector<int> prime_factor(int n){
    vector<int> res;
    for(int i = 2; i * i <= n; i++){
        while(n % i == 0){
            res.push_back(i);
            n /= i;
        }
    }
    if(n != 1) res.push_back(n);
    return res;
}
数学思维

对于大多数数论问题,数学思维是必不可少的一部分。我们需要从数学上理解问题的本质、特征和规律,从而得出正确的结论。

例如,对于求一个数除以另一个数的最高幂的问题,可以根据质因数分解的思想来解决。我们首先对这两个数进行质因数分解,得到它们的质因数分解式 $a=p_1^{a_1}p_2^{a_2}...p_k^{a_k}$ 和 $b=p_1^{b_1}p_2^{b_2}...p_k^{b_k}$,其中 $p_i$ 是第 $i$ 个质数,$a_i$、$b_i$ 分别表示 $a$、$b$ 中第 $i$ 个质数的幂次。那么,$a$ 除以 $b$ 的最高幂即为 $min(a_1-b_1, a_2-b_2, ..., a_k-b_k)$。

代码实现如下:

int max_divide(int a, int b){
    int res = INT_MAX;
    for(int i = 2; i * i <= b; i++){
        if(b % i == 0){
            int cnt = 0;
            while(b % i == 0){
                cnt++;
                b /= i;
            }
            int t = a, p = 0;
            while(t >= i){
                p += t / i;
                t /= i;
            }
            if(p / cnt < res) res = p / cnt;
        }
    }
    if(b > 1){
        int t = a, p = 0;
        while(t >= b){
            p += t / b;
            t /= b;
        }
        if(p < res) res = p;
    }
    return res;
}

至此,我们已经完成了一个数除以其他数的最高幂问题的算法实现。