原题:埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 F
题意:
求第n个符合 x 异或 2x = 3x的正整数
解析:
若x为5(101),2x就是10(1010),异或后便是15(1111),满足要求的数显然就是那些二进制码中没有两个连续1的数
接下来是找规律了
1 No.1
10 No.2
100 No.3
101
1000 No.5
1001
1010
10000 No.8
10001
10010
10100
10101
100000 No.13
100001
100010
100100
100101
101000
101001 -- n 19
101010
以前也做过类似的题目,从高位开始变化,每个位置从0变成1都需要固定的代价,从图中可以看出,第6位变成1需要13,第五位8,第n位==第n-1位+n-2位
例如:
n==19时,首先第6位变成1,n-13变成6,ans==100000,
再第4位变成1,n-5变成1,ans==101000
最后第1位,n变成0,ans==101001
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 50009
#define D long long
D ans;
void fin(D &t){
D a=1,b=2;
if(t==1ll){
ans|=1ll;t=0;return;
}
if(t==2ll){
ans|=2ll;t=0;return;
}
D left=1;
while(t>b){
if(t<a+b)break;
swap(a,b);b+=a;left++;
}
ans|=(1ll<<left);t-=b;
}
int main(){
int t;scanf("%d",&t);while(t--){
D n;scanf("%lld",&n);
ans=0;
while(n){
fin(n);
}
printf("%lld\n",ans);
}
}