题目意思很简单,判断C(n,k)是偶数还是基数。
C(n,k)=n!/(n-k)!k!。可以通过比较分母和分子中约数2的次数来判断。
但怎么得到n!中约数2的个数?
a=0;
while(n=n>>1) a+=n;
为什么这样是正确的?
我们可以从二进制的角度来考虑,首先对任意一个数t,它的二进制表示的末端有多少个0,就说明t的约数2的次数是多少。
于是我们要做的就是统计(1-n)这n个数的二进制表示的末尾0的个数。
然后n>>1即是(1-n)中二进制表示最后一位是0的个数。
n=n>>1;n>>1即是(1-n)中二进制表示倒数二位都是0的个数。
于是可以得到上面算法的正确性。