Description
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.
The definition of Pascal’s Triangle is given below:
The first element and the last element of each row in Pascal’s Triangle is 1 1 1, and the m m m-th element of the n n n-th row equals to the sum of the m m m-th and the ( m − 1 ) (m-1) (m−1)-th element of the ( n − 1 ) (n-1) (n−1)-th row.
According to the definition, it’s not hard to deduce the first few lines of the Pascal’s Triangle, which is:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
…
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 T ( 1 ≤ T ≤ 500 ) T(1≤T≤500 ) T(1≤T≤500), indicating the number of test cases. For each test case:
The first and only line contains an integer k ( 1 ≤ T ≤ 1 0 18 ) k( 1≤T≤10^{18}) k(1≤T≤1018), 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
题解:
Lucas定理:
A、B是非负整数,p是质数。AB写成p进制:A=a[n]a[n-1]…a[0],B=b[n]b[n-1]…b[0]。
则组合数C(A,B)与C(a[n],b[n])C(a[n-1],b[n-1])…*C(a[0],b[0]) modp同余
即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p)
了解更多
这里可以利用卢卡斯定理求杨辉三角形第n行的奇数个数。
代码如下:
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define swap(a,b) (a=a+b,b=a-b,a=a-b)
#define maxn 27
#define N 100000000
#define INF 0x3f3f3f3f
#define mod 1001113
#define e 2.718281828459045
#define eps 1.0e18
#define PI acos(-1)
#define lowbit(x) (x&(-x))
#define read(x) scanf("%d",&x)
#define put(x) prllf("%d\n",x)
#define memset(x,y) memset(x,y,sizeof(x))
#define Debug(x) cout<<x<<" "<<endl
#define lson i << 1,l,m
#define rson i << 1 | 1,m + 1,r
#define ll long long
//std::ios::sync_with_stdio(false);
//cin.tie(NULL);
//const int maxn=;
using namespace std;
ll n;
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
n--;
ll tot=0;
ll j=n;
ll tmp=n&1;
while(j)
{
if(tmp) tot++;
j>>=1;
tmp=j&1;
}
ll ans=pow(2,tot);
printf("%lld\n",ans);
}
}