解题思路:
前num数的二进制数每位都是有周期的,最后一位(设为第一位)周期为1<<1,第二位周期1<<2,所以知道num,就可以知道某一位前面有多少个1。
上边界从上到下试一下就行。
class Solution { boolean check(long ans,long k,long x){ long cnt=0,sum=0; long record=ans+1; while(ans!=0){ cnt+=1; ans/=2; long tmp=1L<<cnt; if(cnt%x==0){ sum+=(record/tmp)*tmp/2+Math.max(record%tmp-tmp/2,0); } // System.out.println(sum+" "+(record/tmp)*tmp/2+" "+Math.max(record%tmp-tmp/2,0)); } return sum<=k; } public long findMaximumNumber(long k, int x) { long l=0; long r=Long.MAX_VALUE>>5; while(l<r){ long mid=(r-l+1)/2+l; // System.out.println(mid+" "+"mid"); if(check(mid,k,x)){ l=mid; } else{ r=mid-1; } } return r; } }