E题:http://codeforces.com/contest/1271/problem/E
分析:分别考虑偶数和奇数,对于每一个x,反推回去的话,可得[2*x,2*x+1]之间的数都是可到到达的,且x越小能到达的值越多,所以满足单调性,二分解决
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll n,k; bool check(ll x){ ll l=x,r=x; if(x%2==0) r++; ll ans=0; while(true){ ans+=min(n,r)-l+1; l<<=1; r<<=1; r++; if(l>n) break; } return ans>=k; } int main(){ cin>>n>>k; ll l=1,r=(n+1)/2; ll ans=0; while(l<=r){///二分枚举合法奇数 ll midd=(l+r)>>1; if(check(2*midd-1)) l=midd+1,ans=2*midd-1; else r=midd-1; } l=1,r=n/2; while(l<=r){///偶数 ll midd=(l+r)>>1; if(check(2*midd)) l=midd+1,ans=max(2*midd,ans); else r=midd-1; } cout<<ans<<endl; return 0; }