题目内容
本题的解题思路为找规律,不同位上的01变化有不同的规律,找出来再依次处理即可;
本题需要用到数据范围为2^64,所以需要用unsigned long long类型
需要注意的是unsigned long long最大也只能存下2^64-1,不考虑的话会在最后一个测试点RE。
#include "bits/stdc++.h"
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
unsigned long long k;
char ans[70];
cin>>n>>k;
for(int i = 0 ; i < n-1 ; i++) //最后一位特殊,只有半个循环
{
if(i!=62) //(这里在i=62时,会产生2^64,ull存不了,最后一个点过不了,需要分开讨论)
{
unsigned long long ci=pow(2,i+2);
unsigned long long ni=(k)%ci;
if(ni >= (ci>>2) && ni < (ci>>2)*3) ans[i]='1';
else ans[i]='0';
}
else
{
unsigned long long ci=pow(2,i);
if(k >= ci && k < ci*3) ans[i]='1';
else ans[i]='0';
}
}
ans[n-1]= k>=(pow(2,n-1)) ? '1' : '0';
for(int i = n-1 ; i >= 0 ; i--) cout<<ans[i];
cout<<"\n";
return 0;
}