分类: C/C++
2015-07-26 19:41:06
N!中要得到包含某个数k的个数,其实相当于[N/k] +[N/k2] +[N/k3] +[N/k4] +...。(不用担心这是无穷的运算,因为总
存在一个k,使得5^K>N,[N/5^K]=0.)
原理:首先,[N/k]等于1,2,3,...,N中能被k整除的数的个数,这是因为连续的整数中,每k个数中只会有一个能够整除k,所以1,2,3,...,N中就相当于划分了[N/k]个区域,每个区域只有一个数可以整除k,所以N!中含有k的个数即为[N/k];
然后,[N/k2]相当于1,2,3,...,N中能被k2整除的数的个数,但是这些数肯定是能够整除k的数的子集,所以本来应该是+2*[N/k2],现在就是+[N/k2]了。
(一个解释:
在书中给出了这个一个公式:N!中含有质因数2的个数 = [N/2] + [N/4] + [N/8] + ...( [N/k] 表示1,2,3,4,...,N中能被k整除的数的个数 )
对于这个公式,自己现在还无法给出严格的数学证明,不过似乎也可以通过实例来理解。
例子:
当N = 8时, N! = 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = (2*2*2) * 7 * (2*3) * 5 * (2*2) * 3 * (2) * 1
1 ~ 8中:
能被2整除的数有 2, 4, 6, 8 ( 8 / 2 = 4 )
能被2^2(4)整除的数有 4, 8 ( 8 / 4 = 2 )
能被2^3(8)整除的数有 8 ( 8 / 8 = 1 )
一个数能被2整除,说明该数至少含有一个质因数2。
一个数能被2^2整除,说明该数至少含有两个质因数2。
……
可以把这个公式当做是一个统计过程——比如数字8,出现了3次,说明其包含了三个质因数2;4出现了两次,即包含两个质因数2;2, 6出现了一次,即分别包含一个质因数2
最后将每次统计的结果相加,即为总的质因数2的个数:4 + 2 + 1 = 7
)