思路:
求n的階乘某個因子k的個數,如果n比較小,可以直接算出來,但是如果n很大,此時n!超出了資料的表示範圍,這種直接求的方法肯定行不通。其實n!可以表示成統一的方式。
n!=(km)*(m!)*a 其中k是該因子,m=n/k,a是不含因子k的數的乘積
下面推導這個公式
n!=n*(n-1)*(n-2)*......3*2*1
=(k*2k*3k.....*mk)*a (a是不含因子k的數的乘積,顯然m=n/k;n!中必定包含1到m個k相乘)
=(km)*(1*2*3...*m)*a
=km*m!*a (統計時ans+=m,然後繼續去求m!中含有的k因子個數)
接下來按照相同的方法可以求出m!中含有因子k的個數。
因此就可以求除n!中因子k的個數
舉例:
比如要求8!中因子2的個數。
原式=8!=1*2*3*4*5*6*7*8
第一步:對8除2(21),相當於將1到8中所有「第乙個」2因子提取出來。 (此時原式=1*1*3*2*5*3*7*4)
第二步:對8除4(22),相當於將1到8中所有」第二個「2因子提取出來。 (此時原式=1*1*3*1*5*3*7*2)
第三步:對8除8(23),相當於將1到8中所有」第三個「2因子提取出來。 (此時原式=1*1*3*1*5*3*7*1)
第四步:對8除16(24),結果為0,退出迴圈。
實現:
1int count(int n,intk)2
9return
num;
10 }
寒假安排 求n !中v因子的個數
b 寒假安排 time limit 1000msmemory limit 64000kb64bit io format lld llu submit status practice acdream 1084 description 寒假又快要到了,不過對於lzx來說,頭疼的事又來了,因為眾多的後宮都...
求n個數 1 n 的質因子
求n個數 1 n 的質因子,我用到了素數篩選法的思想,例如找到素數2,2是2,4,6,8,10 的質因子,3是3,6,9,12 的質因子,然後找到素數5,若是求乙個數n的質因子,請參考 include includeint a 10001 20 b 10001 b i 表示第i個數的質因子個數,a ...
N個數,求第K大數
有n個不重複的數,這n個數可以放入記憶體中,讓你用最快的方法找到第k大的數。解答 一般情況我們可能考慮,先將n個數排序 快排序 堆排序 然後可以得到結果。但是當n很大時這樣做的效率會很低。所以我們提出一種更高效的方法 利用快速排序的特點 第一遍排序會確定乙個數的位置,這個數左邊都比它大,右邊都比他小...