1. 程式人生 > >組合數奇偶性的判斷 對於C(n,k),若n&k == k 則c(n,k)為奇數,否則為偶數。

組合數奇偶性的判斷 對於C(n,k),若n&k == k 則c(n,k)為奇數,否則為偶數。

最直觀的方法就是計算一下,然後看它的奇偶性;但是這個時間以及資料範圍上都不允許;
另外一種方法就是,對於給定C(n,m),檢查n中2因子的個數與m和(n-m)中2因子個數和的關係,假設n!中2因子個數為a,m!中2因子個數為b,(n-m)!中2因子個數為c,則顯然有a>=(b+c);並且當a==b+c時,一定為奇,否則為偶。題意轉化為求a和b+c。求一個階乘中含有的素因子i的個數的方法可以參見Knuth的具體數學,方法是顯而易見的。但是有的時候,這種方法仍然太慢(比如TOJ的一道題目,要判斷5000000次),更快的方法是什麼呢?
方法三:由方法2可以很容易地看出,n!中含有2因子的個數等於(n-它的二進位制形式中1的個數)(每除一次如果有1的話去掉一個1)。那麼題意再次轉化為求m,n-m以及n的二進位制形式中1的個數。或者說,看n&m ?= m,這個呢,如果等於,那麼也就意味著,所有m中為1的位置n一定為1,那麼n-m就可以直接用二進位制減,這樣得到的差的二進位制中1的個數加上m中二進位制1的位數正好等於n中1的位數,由前面可以知道,這就是一個奇數

對於C(n,k),若n&k == k 則c(n,k)為奇數,否則為偶數。