1. 程式人生 > >n階乘後面0的個數+組合數學結果0的個數舉例+公式推導

n階乘後面0的個數+組合數學結果0的個數舉例+公式推導

先掛上一題,用作例子。

(n!%(10^k))==0.

已知n,求能使上式成立的k的最大值。

例如 5!= 120  有1個0,10!= 3628800 ,有2個0。

很明顯,階乘中所有數的因子中有一個2和一個5即產生一個0。但是轉念想到,因子2明顯比5多,所有隻計算5的個數就可以。

10! = 10*9*8*7*6*5*4*3*2*1,5分離出來一個5,10也分離出來一個。

下面對這個結論進行證明:
(1)當n < 5時, 結論顯然成立。
(2)當n >= 5時,令n!= [5k * 5(k-1) * ... * 10 * 5] * a,其中 n = 5k + r (0 <= r <= 4),a是一個不含因子“5”的整數。

說白了,100!就是100/5 = 20,所以可以先提出20個5來,但是25,50,75,100還能再提出5來,即100/5^2 = 4,沒有可以提出3個5的來,所以20+4 = 24,100!末尾有24個0。

附上AC程式碼:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
	int t;
	ll n,sum = 0;
	cin>>t;
	while(t--)
	{
		sum = 0;
		cin>>n;
		for(ll i = 5;i<= n;i*= 5)
		{
			sum+= n/i;
		}
		cout<<sum<<endl;
	}
	return 0;
}

然後就來了這樣一個題:

zjc的ACgirls隊的隊員最近比較忙,為了能夠取得更好的比賽成績,他們制定了一個m天a掉n題的計劃,a掉一題可以是這m天的任何時候。 
為了表示對acmer事業的熱愛,隊長wc要求每天必須至少要ac掉k題,這m天每天ac掉的題數可以用一個m元組表示。 
設不同的m元組一共有c個,請問c的末尾有多少個0?(如果c是0,輸出0) 

這個題就必須考慮2了,因為2不一定比5多,也就是2和5哪個個數少就按哪個算。

這個題用高中組合數學學的插板法比較好做,先給每天安排k-1(k=0除外)個題(為何不安排k個題後面說明),剩下n-(k-1)*m道題,產生n-(k-1)*m-1個空隙(插板只插題目中間的空隙,這裡也就說明了為何前面不安排k個題目了,自己寫寫就清楚了),插進m-1個板,即C(n-(k-1)*m-1,m-1

)。

根據前面的經驗,因子數2的個數就是(n-(k-1)*m-1)!中2的因子數減去(n-(k-1)*m-1-(m-1)) = (n-k*m)!中2的因子數再減去(m-1)!中2的因子數。計算因子為5的個數同理。

附上程式碼:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
	ll m,n,k;
	while(~scanf("%lld %lld %lld",&m,&n,&k))
	{
		ll x = m-1,y = n+(1-k)*m-1;
		ll sum2 = 0,sum5 = 0;
		ll ans;
		for(ll i = 2;i<= y;i*= 2)
			sum2+= y/i-(y-x)/i-x/i;
		for(ll i = 5;i<= y;i*= 5)
			sum5+= y/i-(y-x)/i-x/i;
		ans = sum2>sum5?sum5:sum2;
		printf("%lld\n",ans); 
	}
	return 0;
}
繼續加油!大笑

相關推薦

n後面0個數+組合數學結果0個數舉例+公式推導

先掛上一題,用作例子。 (n!%(10^k))==0. 已知n,求能使上式成立的k的最大值。 例如 5!= 120  有1個0,10!= 3628800 ,有2個0。 很明顯,階乘中所有數的因

Java 演算法程式設計 N末尾0個數問題

求一數N的階層 就是 1*2*3...*n   ,其實求這道題 就是求1到n 中一共可拆解出幾個5,因為2*5=10 ,有一個對5 和2  必然末尾有個0 ,又因為 5肯定比2少 ,所以就簡化成求5的

計算n中尾部0個數

題目描述: 設計一個演算法,計算出n階乘中尾部零的個數。 eg. 11! = 39916800 輸入11,結果應該返回2。 分析: n的階乘可以分解為k和10的m次冪的乘積,結果resul

後面0的數量

isp ios std cout ret view lose include 分享 #include <bits/stdc++.h> #define _xx ios_base::sync_with_stdio(0);cin.tie(0); using nam

51Nod 1003 後面0的數量 | 思維

efi blog png ima mage amp pre strong main 題意:n的階乘後面0的個數,如果直接算出階乘再數0的數量一定會超時的。 因為10=2*5,所以求出5貢獻的次數就行。 #include "bits/stdc++.h" usi

lintcode入門級-計算出n中尾部零的個數

題目地址:https://www.lintcode.com/problem/trailing-zeros/description 我想法很簡單,算出數值大小,直接對尾部進行除法取餘找0: (function () { var trailingZeros = function

【演算法】計算出n中尾部零的個數

思路: 觀察1-20階乘的結果,觀察尾數為0的分佈情況 發現有一個5就會出現一個0 其中5!(有一個5),10!(有兩個5) 5!=120(一個0) 10!=3628800(兩個0) #include <stdio.h> long trailingZeros(long n) {

1003 後面0的數量(51nod) 解題報告

基準時間限制:1 秒 空間限制:131072 KB 分值: 5 難度:1級演算法題  收藏  關注 n的階乘後面有多少個0? 6的階乘 = 1*2*3*4*5*6 = 720,720後面有1

51nod 1003 後面0的數量

n的階乘後面有多少個0? 6的階乘 = 1*2*3*4*5*6 = 720,720後面有1個0。 Input 一個數N(1 <= N <= 10^9) Output 輸出0的數量 Input示例 5 Output示例 1 題解:一個數n的階乘後

n中尾部零的個數(JAVA)

描述 設計一個演算法,計算出n階乘中尾部零的個數 樣例 11! = 39916800,因此應該返回 2 挑戰 O(logN)的時間複雜度 所有可能造成尾部0的只有10的倍數,5的倍數,也就是求階乘中擁有的5的個數。 例如 11 = 1,2,3,4

設計一個演算法,計算出n中尾部零的個數

考慮到只要有5,或者因子為5的數,就可以產生0的尾部。假如1*2*3*4*...*250,那麼250/5=50可以知道,有50個為5的倍數,但是裡面有多少個為25的倍數,125的倍數..., 50/5=10,可知25的倍數有10個,10/5=2,可知125的倍數有兩個,以此

題2:n尾部零的個數

題目描述: 設計一個演算法,計算出n階乘中尾部零的個數。注意:時間複雜度為O(lgn)。 思路: 要求n的階乘,就是求1到n這n個數相乘。在這1到n個數當中,只有2和5相乘的結果才會出現0,其中10的倍數也可以看做是2和5相乘的結果,所以,可以在1到n

100!(100的)後面有幾個0問題

如100!後面有幾個0? 解: 只有2和5組合才可以得到一個末尾的0,能分解成2的有很多,如2,4,6,8都可以分解出2。 但是能分解出5的就比較少,如5,10,15,20,25。。。。,所以能分解出多少個5,末尾就有多少個0。 也就是說100中5的倍數有100/5=20個

【Python】設計一個演算法,計算出n中尾部零的個數

1.常見的思路:先求N的階乘,再計算零的個數。 (但是,時間消耗太大)    def trailingZeros( n):         S = 1         for i in range(1,n+1):             S = S * i        

求一個數在 m 進制下末尾 0個數

long out ret pri bsp init 做的 題意 true 題意 :   求一個數 n 的階層在 m 進制下末尾 0 的個數 思路分析 :   如果是 10 進制地話我們是很容易知道怎麽做的,數一下其對 5 約數地個數即可,但是換成 m 進制的

求整數NN!末尾有多少個0呢?

一、採用常規的做法,求出N的階乘,然後計算出該結果末尾的0的個數; 這種方法有兩個缺陷: (1)無論將結果定義為long還是double,結果值都會溢位; (2)效率低下; 方法一: 那麼我們

斯特林公式-Stirling公式(取N近似值)-HDU1018-Big Number 牛客網NowCoder 2018年全國多校算法寒假訓練營練習比賽(第三場)A.不凡的夫夫

subject color content coder -m ria 一點 練習 java 最近一堆題目要補,一直鹹魚,補了一堆水題都沒必要寫題解。備忘一下這個公式。 Stirling公式的意義在於:當n足夠大時,n!計算起來十分困難,雖然有很多關於n!的等式,但並不能很

、排列與組合

排列組合 排列組合是組合學最基本的概念。所謂排列,就是指從給定個數的元素中取出指定個數的元素進行排序。組合則是指從給定個數的元素中僅僅取出指定個數的元素,不考慮排序。 Python程式碼實現 功能一:

還是逆元之O(n)逆元。。。

除草 做一個題發現了一個逆元的知識盲點,就是階乘的逆元 然後發現了可以這樣 fac[0]=fac[1]=1; for(int i=2;i<=MAXN;i++)fac[i]=fac[i-1]*i%mod; inv[MAXN]=quipow(fac[MAXN],mod-2

javascript實現n的2個方法

方案一:利用while迴圈 function factorial(num){ var result = 1; while(num){ result *= num; num--; } return result; }方案二:利用函式遞迴 f