#include <cstdio>
#include <cstdlib>
int isodd(int n,int k)
{
if((n&k)==k)
return 1;
return 0;
}
int oddsum(int n)
{
if(n==0) return 1;
int a=1;
while(n/2)
{
a*=(n%2+1);
n/=2;
}
return 2*a;
}
int main()
{
int n,k;
while (scanf("%d %d", &n, &k) != EOF) {
--k;
printf("%d %d\n", isodd(n,k),oddsum(n) );
}
//system("pause");
return 0;
}
http://acm.fzu.edu.cn/problem.php?pid=1622
题目大意:给出两个数n,k,问在杨辉三角中第n行第k列的数是偶数还是偶数,第n行有多少个奇数。行数从0开始,列数从1开始。
组合数有如下性质:C(n,k)=C(n,k-1)+C(n-1,k-1),杨辉三角第n行第k满足上述性质,可以用组合数来表示。
另外,有如下结论:
1、组合数C(n,k)如果满足n&k=k,则是奇数,否则是偶数;
2、把n转化成2进制,a1a2a3...ai,奇数个数为(a1+1)*(a2+1)*(a3+1)...(ai+1);
以上结论很好很强大,要记住!
附代码: