Little Sub and Pascal's Triangle (杨辉三角形)

9 篇文章 0 订阅

Little Sub and Pascal's Triangle

Little Sub is about to take a math exam at school. As he is very confident, he believes there is no need for a review.

Little Sub's father, Mr.Potato, is nervous about Little Sub's attitude, so he gives Little Sub a task to do. To his surprise, Little Sub finishes the task quickly and perfectly and even solves the most difficult problem in the task.

Mr.Potato trys to find any possible mistake on the task paper and suddenly notices an interesting problem. It's a problem related to Pascal's Triangle.

“math”/

The definition of Pascal's Triangle is given below:

The first element and the last element of each row in Pascal's Triangle is , and the -th element of the -th row equals to the sum of the -th and the -th element of the -th row.

According to the definition, it's not hard to deduce the first few lines of the Pascal's Triangle, which is:


......

In the task, Little Sub is required to calculate the number of odd elements in the 126th row of Pascal's Triangle.

Mr.Potato now comes up with a harder version of this problem. He gives you many queries on this problem, but the row number may be extremely large. For each query, please help Little Sub calculate the number of odd elements in the -th row of Pascal's Triangle.

Input

There are multiple test cases. The first line of the input contains an integer (), indicating the number of test cases. For each test case:

The first and only line contains an integer (), indicating the required row number in Pascal's Triangle.

Output

For each test case, output the number of odd numbers in the -th line.

Sample Input

3 
3 
4 
5

Sample Output

2 
4 
2

 强行找规规律

我先打了 260行的表

然后发现 如果是 2^n 次方 行 就有 2 ^ n 个奇数,然后我就思考那 2 ^ n 次方 + 1 到 2 ^(n+1)的值是否有规律呢?

果然发现的规律,下面 (2 ^ i)是第 (2 ^ i)行有多少个奇数。

2^0  到 2^1

2^1 +1 到  2^2

2 ^2 + 1 到 2 ^ 3

…………

…………

2 ^x +1 到 2 ^ x

然后我打表的时候让他每  2 的 i 次方换行

发现他们的前半部分和上一个区间一样,后半部分是前半部分值的二倍。这时就可以想到递归。

给我们一个x 的值 就判断他在哪个区间,然后判断是在前半部分还是后半部分。

#include<iostream>
using namespace std;
typedef long long ll;

ll find(ll x){
	if(x == 1)
		return 1;
	if (x == 2)
		return 2;
	ll i;
	for(i = 1; i < x; i <<= 1 ); //找到区间的最大值( 2^i )
	
	if( x - (i >> 1 ) > (i >> 2) )    // 判断是再前半部分还是后半部分
		return find( x - (i >> 1 ) ) * 2;    //后半部分
	else   
		return find( x - (i >> 2) );    //前半部分
}

int main (){
	int n;
	cin >> n;
	ll x; 
	for(ll i = 1; i <= n; i++){
		cin >> x;
		cout << find(x) << endl;
	}
	
	return 0;
}

第二种解法是网上的规律

你先把 第 i 行  这个 i - 1 转化为 2 进制,里面有多少个1  就有多少个奇数。

#include<iostream>
using namespace std;
typedef long long ll;
int main(){
	int n; 
	cin >> n;
	for(ll i = 1; i <= n; i++){
		ll x;
		cin >> x;
		x --; 	//第 2  
		ll e = 1;
		while(x != 0){
			if(x & 1) {
				e <<= 1;
				x >>= 1;	
			}
			else{
				x >>= 1;
			}
		}
		cout << e << endl;
	}
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值