链接:
https://www.nowcoder.com/acm/contest/91/F
来源:牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
小Y在研究数字的时候,发现了一个神奇的等式方程,他屈指算了一下有很多正整数x满足这个等式,比如1和2,现在问题来了,他想知道从小到大第N个满足这个等式的正整数,请你用程序帮他计算一下。
(表示按位异或运算)
输入描述:
第一行是一个正整数,表示查询次数。
接着有T行,每行有一个正整数,表示小Y的查询。
输出描述:
对于每一个查询N,输出第N个满足题中等式的正整数,并换行。
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
/*打表观察找规律吧,解释起来有点麻烦。*/
typedef unsigned long long ull;
ull Pow(ull p){//快速幂
ull ans=1;
ull base=2;
while (p) {
if(p&1){
ans*=base;
}
base*=base;
p>>=1;
}
return ans;
}
int main()
{
ull f1,f2,f3;
vector<ull> v;
ull sum=1;
v.push_back(0);
v.push_back(1);
for(f1=1,f2=1;sum<=1e12;){//每个长度的二进制数的数量对应斐波那契数列的一个数
v.push_back(sum+1);
f3=f1;
f1+=f2;
f2=f3;
sum+=f1;
}
int t;
ull n;
ull res;
cin>>t;
while (t--) {
cin>>n;
res=0;
for(int i=v.size()-1;i>=0;i--)//从最大数开始减
{
if(n>=(v[i]+1)){//思考一下这里
n-=(v[i]+1);
res+=Pow(i);
if(n==0){
break;
}
}
}
cout<<res<<endl;
}
return 0;
}