一、题目
题目描述
求 C ( n , 0 ) , C ( n , 1 ) . . . C ( n , n ) C(n,0),C(n,1)...C(n,n) C(n,0),C(n,1)...C(n,n)有多少个是奇数
数据范围
1 ≤ n ≤ 1 e 8 1\leq n\leq 1e8 1≤n≤1e8
二、解法
这道题只关乎奇偶性,所以可以默认模数为 2 2 2,我们尝试用 lucas \text{lucas} lucas,设 a a a为 n n n的二进制分解, b b b为 i i i的二进制分解。
C ( a , b ) = C ( a [ k ] , b [ k ] ) . . . . × C ( a [ 1 ] , a [ 1 ] ) % 2 C(a,b)=C(a[k],b[k])....\times C(a[1],a[1])\%2 C(a,b)=C(a[k],b[k])....×C(a[1],a[1])%2,那么我们必须要保证每一项都是 1 1 1,当 a a a的那一位是 0 0 0时, b b b只能取 0 0 0,但是 a a a为 1 1 1时 b b b可以取 0 / 1 0/1 0/1,所以问题变成了求 n n n的二进制分解的 1 1 1的个数 k k k,然后输出 2 k 2^k 2k即可。
#include <cstdio>
int read()
{
int x=0,flag=1;char c;
while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;
while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*flag;
}
int n,m;
signed main()
{
while(~scanf("%d",&n))
{
m=0;
while(n>0)
{
if(n&1) m++;
n/=2;
}
printf("%d\n",1<<m);
}
}