poj2249 Binomial Showdown

鏈接:http://poj.org/problem?id=2249

題意:就是要求組合數C(n,k)

之前在藍橋杯上做過一個題,要用到組合數。但是那個做完只過了一半的數據,可能有更大的數據。

一直在想有沒有什麼非常巧妙的、快速的方法,或者是什麼公式求組合數。

沒有的。就是按照組合數的定義公式來求解。

不過,程序具體處理過程中,一般的處理都是“邊乘邊除”,這樣既保證數據不會太大,同時也減少了一部分時間。

還有一點就是還得看數據的大小。這個題目long long能過了。如果有更大的數字,任何一種數據類型都無法表示的了。

這時可能就要考慮高精度了。

而我覺得,組合數要用高精度做那可是相當吃力的。既有乘法又有除法。關鍵是除法好嘛。

一般的數據,估計還是用這樣的方法比較好。

 

#include<stdio.h>

long long Combine(int n,int k)
{
	long long ans=1,j=2,i;
    if(k==0)
	  return 1;
    for(i=n;i>=n-k+1;i--)
	{
	   ans*=i;           //邊乘邊除
	   if(ans%j==0&&j<=k)
	   {
	      ans/=j;
		  j++;
	   }
	}
	return ans;
}

int main()
{
	int n,k;
	while(scanf("%d%d",&n,&k)!=EOF)
	{
	   if(!n&&!k)
		   return 0;
	   if(n-k<k)//公式C(n,k)=C(n,n-k)
		   k=n-k;
	   printf("%ld\n",Combine(n,k));
	}
	return 0;
}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章