📜  最小平方除数(1)

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

最小平方除数

在数学中,平方除数是指一个正整数能被一个平方数整除的最小正整数。

最小平方除数(Minimum square divisor,简称MSD)则是指一个正整数的所有平方因子中最小的一个。例如,最小平方除数为2的正整数包括2、4、6、8等等,最小平方除数为3的正整数包括3、9、12、15等等。

对于给定的正整数n,要找到最小的正整数x使得n能被x^2整除。

解决方案

一种简单的方法是,对于每个平方数x^2,判断n是否能被x^2整除。但是,这种方法的时间复杂度为O(sqrt(n)),如果n很大,则时间复杂度将非常高。

更好的方法是,将n分解成其质因子的乘积,然后对于每个不同的质因子p,找到p的最高次幂k,即p^k是n的一个因子。则n的最小平方除数就是所有质因子的最高次幂的一半。

例如,对于n=1800,它的质因子分解为2^3 * 3^2 * 5^2,因此n的最小平方除数为min(2^(3/2), 3, 5) = 2sqrt(2) ≈ 2.83。

代码实现

下面是C++的代码实现:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int n;
    cin >> n;
    int msd = 1;
    for (int i = 2; i * i <= n; i++) {
        int cnt = 0;
        while (n % i == 0) {
            cnt++;
            n /= i;
        }
        if (cnt != 0) msd = max(msd, int(sqrt(i)) * pow(i, (cnt + 1) / 2));
    }
    if (n > 1) msd = max(msd, n);
    cout << msd << endl;
    return 0;
}

该代码首先读入给定的正整数n,然后对于每个质因子i,找到其最高次幂cnt,计算(√i)i^(⌈cnt/2⌉)并更新最小平方除数msd。最后,如果n>1,则n本身也是一个质因子,更新msd并输出。这种方法的时间复杂度为O(sqrt(n)+logn)。

总结

最小平方除数是一个有趣的数学概念,也是一个实际的计算问题。使用质因子分解和平方根运算,我们可以快速地找到一个正整数的最小平方除数。