Q1(Markdown不太会用)
[题目](http://go.helloworldroom.com:50080/contest/78/problem/12859)
分析一下:for example: 4出现于那些步骤? 答:4,5,8,9,10,11,16,17,18,19,20,21,22,23,33......
分一下类:4.5 / 8 9 10 11 / 16,17,18,19,20,21,22,23,33
进一步发现:这些数字在(x1,y1) (x2,y2)这样的区间中(x2=x1乘(符号怎么打?)2,y2=y1乘2+1)
对于偶数n来说,x1=n,x2=n+1; 对于奇数n来说,x1=n乘2,x2=n乘2+1;(不要忘记n本身未算在内)
不要问我如何发现的
然后,将1至n分为奇数与偶数分别二分,比较奇偶数中大者输出
主要函数:
int se(int l){
if(l==0) return m+10;
int ans=0;
if(l%2==1){
ans++;
}
else l/=2;
int a1=l,a2=l;
while(1){
a1*=2;
a2*=2;
a2++;
if(a1>n){
return ans;
}
if(a2>n){
ans+=n-a1+1;
return ans;
}
else ans+=a2-a1+1;
}
}
二分部分:
int l=1,r=(n+1)/2;
while(l<r){
int mid=(l+r)/2+1;
int sum=se(mid*2-1);
if(sum>=m){
l=mid;
}
else r=mid-1;
}//奇数
l=l*2-1;
int l2=0,r2=n/2;
while(l2<r2){
int mid=(l2+r2)/2+1;
int sum=se(mid*2);
if(sum>=m){
l2=mid;
}
else r2=mid-1;
}
l2=l2*2;//偶数