良辰最喜欢对那些自认能力出众的人出手(感谢cqupt..
发布时间: 2015年11月8日 22:31 最后更新: 2015年11月8日 22:35 时间限制: 1000ms 内存限制: 128M
描述
果果一直很谦虚,但是良辰还是对他出手了(汗。。
良辰拿出来一个 Pascal 三角形(也叫杨辉三角形。(请不要问是怎么拿出来的。。
我们用一个矩阵来表示 Pascal 三角形
0: C(0, 0)
1: C(1, 0) C(1, 1)
2: C(2, 0) C(2, 1) C(2, 2)
…
其中最左边的数字表示行号。C(x, y) 表示一个组合数,即 x 个元素中取 y 个的方法数。
良辰只有一个问题:Pascal 三角形中的第 n 行有多少个奇数?
这样的问题对于果果来说太水了,于是他把这个问题给了你。
输入
第一行为一个整数 T,表示数据组数。 每组数据只有一行,包含一个整数 n,表示 Pascal 三角形的第 n 行。 T <= 2000,0 <= n <= 2^31
输出
每组数据输出一行,包含一个整数,表示Pascal 三角形的第 n 行中的奇数个数。
样例输入1 复制
2
0
1
样例输出1
1
2
Pascal 三角形中奇数项的个数:
以 2 为底,N 的二进制表示中 1 的个数次幂.
例如:
83 = 64 + 16 + 2 + 1 二进制表示为 (1010011),则 83行有 24=16 个奇数。
背后的数学原理:
我们的证明用到了 二次项定理 和 模算数。
根据二次项定理
(1+x)N=∑nk=0(nk)xk.
如果将系数模2,则容易得到一个结论,当 N>=0 时
(1+x)2N=(1+x2N)(mod2)
所以
(1+x)10=(1+x)8(1+x)2=(1+x8)(1+x2)=1+x2+x8+x10(mod 2)
可以看出,当 k = 0, 2, 8, 10 时,(nk) 为奇数。
从 (1+x)^8 (1+x)^2 ,可以看出与 10(1010) 的关系。
AC代码
#include<stdio.h>
#include<math.h>
double qdu(int n)
{
double cnt = 0;
while(n)
{
if(n%2) cnt++;
n /= 2;
}
return cnt;
}
int main()
{
int loop;
scanf("%d",&loop);
while(loop--) {
int a;
scanf("%d",&a);
printf("%.0f\n",pow(2.0,qdu(a)));
}
return 0;
}