程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> HDU 4349 組合數的奇數個數

HDU 4349 組合數的奇數個數

編輯:關於C++

題意:給你一個n,求C (n,0),C (n,1),C (n,2)...C (n,n),奇數的個數。

分析:

Lucas定理:

A、B是非負整數,p是質數。AB寫成p進制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]。
則組合數C(A,B)與C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0]) modp同余

即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p)

來看這一題,求奇數,那麼我們就用二進制,這樣一想思路就打開了,C(n,m)=C(a[nk1],b[mk1])*C(a[nk2][mk2])****(mod 2),我們知道C(0,1)是0,所以只要n的二進制位上為0的位置,如果m在該位的二進制是1,則C(n,m)模2就等於0,即為偶數,否則為奇數;而C(1,0),C(1,1)都為1,所以n的二進制位上為1的位置,m在對應位置可以填0也可以填1,這就變成了一個組合問題了,設n的二進制位共有k個1,那麼使C(n,m)為奇數的m共有2^k種。

有些題不會做打表找規律也是個好方法

代碼:

 

#include
#include
#include
using namespace std;
int n;
int main()
{
	while(scanf(%d,&n)!=EOF){
		int tot=0;
		int j=n;
		int tmp=n&1;
	    while(j){
	    	if(tmp) tot++;
	    	j>>=1;
	    	tmp=j&1;
	    }
	    int ans=pow(2,tot);
		printf(%d
,ans);
	}
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved