对于给定的数字A,找到最小的整数B,使得A除以B! (B阶乘)

时间:2015-09-15 08:14:37

标签: algorithm

A给予A = X^Y一些积极的XY

约束:

1 <= Y <= 30000
1 <= X <= 1000000000 (10^9)

测试用例

X = 2 and Y = 2. 
Minimum value of B is 4 (as B! = 4! = 24, A = X^Y = 4 and B! % A = 24 % 4 = 0)

X = 2 and Y = 3. 
Minimum value of B is 4 (as B! = 4! = 24, A = X^Y = 8 and B! % A = 24 % 8 = 0)

X = 1000000000 and Y = 30000. 
Minimum value of B is 1080015

问题的链接:https://codefights.com/challenge/XPjFvvKW4kk35jeLp

1 个答案:

答案 0 :(得分:3)

你可以考虑因素X^Y。第一因素X

X = p1^e1 * ... * pk^ek

然后X^Y将是:

X^Y = p1^(e1*Y) * ... * pk^(ek*Y)

然后您可以二分搜索B:对于固定值,找出pX^Y的每个素因子B!出现的次数。这等于:

floor(B / p) + floor(B / (p^2)) + ...

你可以这样实现:

count(B, p):
  s = 0

  while B != 0:
      s += B / p
      B /= p

  return s

如果此函数为>= ei*Y的每个素因子pi返回X^Y,则此B值是可行的:减少下半部分的搜索以查看是否可以找一个较小的。否则,将搜索减少到上半部分。

问题陈述说B将适合整数,让我们假设一个64位。这意味着二进制搜索的最多64次迭代。截至X的{​​{1}} 10^9只有大约20个素因子,count函数在O(log B)中运行。所以期望围绕64*20*64运算,加上初始分解所需的几个运算。应该跑得很快。