P5657c++
签到题,不过也有很多细节。算法
数据范围须要开 unsigned long long
,前年也有不少人所以丢了5分。函数
pow
会出现神必错误,须要手写一个 mpow
函数。spa
我是记录当前的 \(l,r\) 判断 \(k\) 与 \(mid\) 的大小,而后分类讨论倒序和正序时选左边和选右边手玩的结论。变量 \(f\) 表明顺序,0 表明正序,1 表明倒序。code
\(k\) 在左边时输出 \(f\) 并令 \(f\) 等于 0,\(k\) 在右边时输出 \(1-f\) 并令 \(f\) 等于 1,而后二分下去便可。ci
但这样作在 mid=(l+r)>>1
时可能爆 unsigned long long
,因此改为mid=l/2+r/2+(l%2==1&&r%2==1);
。get
#include<bits/stdc++.h> using namespace std; #define int unsigned long long int n,k; int qpow(int a,int b){ int ans=1llu; while(b){ if(b&1llu)ans=ans*a; a=a*a; b>>=1llu; } return ans; } signed main(){ cin>>n>>k; int l=0llu,r=qpow(2,n)-1llu,mid,f=0; while(l<r){ mid=l/2+r/2+(l%2==1&&r%2==1); if(k<=mid) cout<<f,f=0,r=mid; else cout<<1-f,f=1,l=mid+1; } return 0; }
签道题罢了it