A: Little Sub and Pascal's Triangle

Solved.

题意:

求杨辉三角第n行奇数个数

思路:

薛聚聚说找规律,16说Lucas

答案是 $2^p \;\;p 为 n - 1 中 以2进制表示下1的个数$

证明

$Ans = \sum\limits_0^n C_n^i \;\%\; 2 = \sum\limits_0^n C_{\frac{n}{2}}^{\frac{i}{2}} \cdot C_{n\;\%\;2}^{i\;\%\;2}$

我们考虑 $C_{n \;\%\; 2}^{i \;\%\; 2}$ 一共有四种取值

$C_0^0 \;\; C_0^1\;\; C_1^0 \;\; C_1^1$

我们发现 只有 $C_0^1的值为0 其他三个值都为1$

那么我们再考虑$C_n^i 这个式子$

它通过卢卡斯定理分解 实际上可以写成

我们先假设 

$i 以二进制表示为$

$a_1, a_2, \cdots a_k$

$n 以二进制表示为$

$b_1, b_2, \cdots b_k$

那么 $C_n^i = C_{b_1}^{a_1} \cdot C_{b_2}^{a_2} \cdots C_{b_k}^{a_k}$

那么我们发现,

要满足$C_n^i\;\%\; 2 = 1 \;\;$

$那么在b_y = 1的位置上,i在对应位置上取0或者1都可以$

在$b_y = 0 的位置上,i在对应位置的取值已经固定 是 0$

那么$i的取值一共有2^p  p 为(n - 1)以2进制表示下1的个数$

为什么是$n - 1 \;\;因为杨辉三角是从第0行开始的$

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 typedef long long ll;
 6 
 7 ll n;
 8 
 9 int main()
10 {
11     int t;
12     scanf("%d", &t);
13     while(t--)
14     {
15         scanf("%lld", &n);
16         n--;
17         ll tmp = 0;
18         while(n)
19         {
20             if(n & 1) tmp++;
21             n >>= 1;
22         }
23         ll ans = 1ll << tmp;
24         printf("%lld\n", ans);
25     }
26     return 0;
27 }
View Code

相关文章: