int combination( int n, int k)
c(n,k) = c(n-1,k) + c(n-1,k-1);對組合數c(n,k) (n>=k):將n,k分別化為二進位制,若某二進位制位對應的n為0,而k為1 ,則c(n,k)為偶數;否則為奇數。
組合數的奇偶性判定方法為:
結論:
對於c(n,k),若n&k == k 則c(n,k)為奇數,否則為偶數。
證明:
利用數學歸納法:
由c(n,k) = c(n-1,k) + c(n-1,k-1);
對應於楊輝三角:
1 1 1
1 2 1
1 3 3 1
1 4 6 4 1
可以驗證前面幾層及k = 0時滿足結論,下面證明在c(n-1,k)和c(n-1,k-1) (k > 0) 滿足結論的情況下,
c(n,k)滿足結論。
1).假設c(n-1,k)和c(n-1,k-1)為奇數:
則有:(n-1)&k == k;
(n-1)&(k-1) == k-1;
由於k和k-1的最後一位(在這裡的位指的是二進位制的位,下同)必然是不同的,所以n-1的最後一位必然是1
現假設n&k == k。
則同樣因為n-1和n的最後一位不同推出k的最後一位是1。
因為n-1的最後一位是1,則n的最後一位是0,所以n&k != k,與假設矛盾。
所以得n&k != k。
2).假設c(n-1,k)和c(n-1,k-1)為偶數:
則有:(n-1)&k != k;
(n-1)&(k-1) != k-1;
現假設n&k == k.
則對於k最後一位為1的情況:
此時n最後一位也為1,所以有(n-1)&(k-1) == k-1,與假設矛盾。
而對於k最後一位為0的情況:
則k的末尾必有一部分形如:10; 代表任意個0。
相應的,n對應的部分為: 1*; *代表0或1。
而若n對應的*中只要有乙個為1,則(n-1)&k == k成立,所以n對應部分也應該是10。
則相應的,k-1和n-1的末尾部分均為01,所以(n-1)&(k-1) == k-1 成立,與假設矛盾。
所以得n&k != k。
由1)和2)得出當c(n,k)是偶數時,n&k != k。
3).假設c(n-1,k)為奇數而c(n-1,k-1)為偶數:
則有:(n-1)&k == k;
(n-1)&(k-1) != k-1;
顯然,k的最後一位只能是0,否則由(n-1)&k == k即可推出(n-1)&(k-1) == k-1。
所以k的末尾必有一部分形如:10;
相應的,n-1的對應部分為: 1*;
相應的,k-1的對應部分為: 01;
則若要使得(n-1)&(k-1) != k-1 則要求n-1對應的*中至少有乙個是0.
所以n的對應部分也就為 : 1*; (不會因為進製變1為0)
所以 n&k = k。
4).假設c(n-1,k)為偶數而c(n-1,k-1)為奇數:
則有:(n-1)&k != k;
(n-1)&(k-1) == k-1;
分兩種情況:
當k-1的最後一位為0時:
則k-1的末尾必有一部分形如: 10;
相應的,k的對應部分為 : 11;
相應的,n-1的對應部分為 : 10; (若為11,則(n-1)&k == k)
相應的,n的對應部分為 : 11;
所以n&k = k。
當k-1的最後一位為1時:
則k-1的末尾必有一部分形如: 01; (前面的0可以是附加上去的)
相應的,k的對應部分為 : 10;
相應的,n-1的對應部分為 : 01; (若為11,則(n-1)&k == k)
相應的,n的對應部分為 : 10;
所以n&k = k。
由3),4)得出當c(n,k)為奇數時,n&k = k。
綜上,結論得證!
全排列遞迴演算法
全排列是將一組數按一定順序進行排列,如果這組數有n個,那麼全排列數為n 個。現以為 例說明如何編寫全排列的遞迴演算法。1 首先看最後兩個數4,5。它們的全排列為4 5和5 4,即以4開頭的5的全排列和以5開頭的4的全排列。由於乙個數的全排列就是其本身,從而得到以上結果。2 再看後三個數3,4,5。它...
全排列(遞迴演算法)
一 全排列演算法 從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。公式 全排列數f n n 定義0 1 演算法 遞迴演算法 網路上偷了乙個圖 全排列 順便複習乙個數學公式 排列的定義 從n個不同元素中,任取...
全排列遞迴演算法
對於乙個長為 n 的陣列,它的全排列一共有 n!種可能,演算法複雜度最小為o n!如果還需要列印出結果,那麼演算法複雜度為 o n n!演算法設計的思路是,對於第一位給定乙個值,剩下的 n 1 位進行全排列,然後通過乙個迴圈遍歷第一位所有可能的值,這裡我們是通過交換來改變第一位的值,對於 n 1 位...