组合数

c(n,k)(k<=n)的奇偶性取决于(n-k)与k的二进制表达式是否存在同一位上的两个数码均为1,若存在,则为偶数,反之为奇数。

求c(n,k)可以通过公式
C(n, 0) = C(n, n) = 1 for all n > 0;
C(n, k) = C(n − 1, k − 1) + C(n − 1, k) for all 0 < k < n.

递归并保存值,这里用一个二维数组array[n][k],但是考虑到有的题n比较大,数组存不下。

 

还可以通过代码:

View Code
 1 View Code 
 2  1 #include <iostream>
 3  2 #include <stdio.h>
 4  3 using namespace std;
 5  4 
 6  5 void function(int m,int n)
 7  6 {
 8  7     int k,t,i,p;
 9  8     k=m-n<n?m-n:n;
10  9     t=m-n>=n?m-n:n;
11 10     p=1;
12 11     for(i=1;i<=k;i++)
13 12         p+=p*t/i;
14 13     printf("%d\n",p%2);
15 14 }
16 15 
17 16 int main()
18 17 {
19 18     int m,n;
20 19     while(scanf("%d%d",&m,&n)!=EOF)
21 20     {
22 21         funtion(m,n);    
23 22     }
24 23     return 0;
25 24 }

 

posted @ 2012-08-08 07:41  pushing my way  阅读(205)  评论(0编辑  收藏  举报