C++ 中未知数乘积中的最大公约数
假设我们有两个整数 N 和 P。P 是 N 个未知整数的乘积。我们必须找出这些整数的最大公约数。将产生不同的整数组,它们会得到相同的结果。此处我们将生成的最大公约数,在所有可能的组中最大。假设 N = 3,且 P = 24,则不同的组将如 {1, 1, 24}、{1, 2, 12}、{1, 3, 8}、{1, 4, 6}、{2, 2, 6}、{2, 3, 4}。最大公约数为:1、1、1、1、2、1。因此,这里的答案是 2。
这种技术如下所示,假设 g 是 a1、a2、… an 的最大公约数。则 ai 是 g 的倍数,而 P 是 (a1 * a2 * … * an) 一定要 gn 的倍数。答案是使得 gn mod P = 0 的最大 g。现在假设 P = k1p1 * k2p1 * … * knpn。g 必须是这种形式,然后要使 g 最大化,我们必须选择 pi = pi / N。
示例
#include <iostream> #include <cmath> using namespace std; long getMaxGCD(long n, long p) { int count = 0; long gcd = 1; while (p % 2 == 0) { p >>= 1; count++; //number of times P divided by 2 } if (count > 0) //if p has some 2s, then gcd = gcd* (long)pow(2, count / n); for (long i = 3; i <= sqrt(p); i += 2) { //check for all numbers after 2 count = 0; while (p % i == 0) { count++; p = p / i; } if (count > 0) { gcd = gcd* (long)pow(i, count / n); } } // If n in the end is a prime number if (p > 2) gcd = gcd* (long)pow(p, 1 / n); return gcd; } int main() { long n = 3; long p = 24; cout << "MAX GCD: " << getMaxGCD(n, p); }
输出
MAX GCD: 2
广告