/*
方法一
Accepted | 4349 | 859MS | 228K | 302 B | C++ |
先来补充一下二项式奇偶性的知识
C(n, k) 若n&k == k,则为奇数,否则为偶数
证明比较复杂,想知道的百度一下就有了
*/
#include<iostream>
using namespace std;
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
int i, ans=0;
for( i=0; i <= n/2; i++ )
{
if((n&i) == i)
ans++;
}
printf("%d\n", ans*2);
}
return 0;
}
/*
Accepted | 4349 | 31MS | 228K | 307 B | C++ |
Lucas定理应用
Lucas定理:把n写成p进制a[n]a[n-1]a[n-2]...a[0],把m写成p进制b[n]b[n-1]b[n-2]...b[0],
则C(n,m)与C(a[n],b[n])*C(a[n-1],b[n-1])*C(a[n-2],b[-2])*....*C(a[0],b[0])模p同余。
开始看这句话的时候是一头雾水
这题p为2,就是都把n,m转换成二进制,比如说n=44,二进制为n=101100,m从000000遍历到1111111,以为C(0, 0)==C(1, 0)==C(1, 1) == 1;只有C(0,1)==0;所以二进制n有0的位置m在该位置必须也为0,n原本是1的地方可以填0或1都可以,本题就简化为计算二进制数中1的个数,根据排列组合,易得有2^t .(t表示1的个数)
*/
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;
while(scanf("%d", &n) != EOF )
{
int t=0;//t计数而进制n中1的个数
for(n)
{
if(n&1)//n%=2;
t++;
n >>= 1;//n /= 2
}
printf("%d\n", 1<<t);//表示2^t
}
return 0;
}