计算x!可能非常昂贵,可能经常导致溢出。有没有办法找出是否x!如果没有计算x,你可以被y整除吗?
答案 0 :(得分:7)
计算x!
和y
的{{3}}。您可以通过将每个数字从x!
分解为2
并将所有因素收集在一起来计算x
,而无需计算y
。如果x!
的因子是{{1}}因子的子集,则它可以被整除。
答案 1 :(得分:6)
如果x和y真的很大,那么迭代遍历所有数字1到x是不可行的,你可以改为对因子进行因子分解并计算每个素数因子y的最大幂是否也分开X!
我已经写过更详细的算法in another answer。
基本上检查是这样的:
// computes maximum q so that p^q divides n!
bool max_power_of_p_in_fac(int p, int n) {
int mu = 0;
while (n/p > 0) {
mu += n/p;
n /= p;
}
return mu;
}
// checks whether y divides x!
bool y_divides_x_fac(int y, int x) {
for each prime factor p^q of y:
if (max_power_of_p_in_fac(p, x) < q)
return false;
return true;
}
这导致情况x <1的算法。 y的复杂度O(分解y + log x * y的素数因子的时间)。
显然,y可能具有O(log y)素数因子。所以使用Pollard's rho factorization这就像O(y ^(1/4)+ log x * log y)
可以使用this theorem证明正确性:
答案 2 :(得分:2)
对于i
到1
的每个x
,请更新y /= gcd(y, i)
。最后的可分性检查是y == 1
。