计算x!可能非常昂贵,而且往往会导致溢出。有没有一种方法可以在不计算x!的情况下找出它是否可被y整除呢?
- 对于y<x,这是微不足道的;
- 但是,对于y>x,例如x=5和y=60;我正在努力寻找一种方法,而不需要计算x!
计算x!可能非常昂贵,而且往往会导致溢出。有没有一种方法可以在不计算x!的情况下找出它是否可被y整除呢?
计算x!
和y
的质因数分解。你可以通过对2
到x
中的每个数字进行因式分解并将所有因子收集在一起来完成此操作,而无需计算x!
。如果y
的因子是x!
的因子的子集,则x!
可被y
整除。
// 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;
}
对于从 1
到 x
的每个数字 i
,执行操作 y /= gcd(y, i)
。最后进行整除检查,判断 y == 1
是否成立。
y
和x
相比如何?如果y<=x
,那么y
肯定能整除x!
。如果y
是质数且y>x
,那么它不能整除,但是如果y>x
且它的所有质因数都<=x
,那么也许可以... 在这种情况下,您可以通过生成2..x
的所有因子列表,然后确保y
的因子是该列表的子集来解决它... - twalbergy
的质因数分解或多或少地解决了问题,而且似乎是最小量的工作。 - clwhisk