我的代码:#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,l,k;
//求1~x的二进制串有多少1
ll cal(ll x){
ll res=0;
x++;
for(ll i=0;i<=55;i++){
ll a=(1ll<<(i+1));
ll b=(1ll<<(i));
ll c=(x/a)*b+max(x%a-b,0ll);
res+=c;
}
return res;
}
int main(){
scanf(“%lld”,&t);
while(t–){
scanf(“%lld%lld”,&l,&k);
k+=cal(l-1);//原来的k指的是从L开始的二进制串中的第k个1
ll L=0,R=1e16+1;//(<1>~的二进制串中的第k个1
while(L+1<R){
ll mid=(L+R)/2;
if(cal(mid)<k){
L=mid;
}
else{
R=mid;
}
}
printf(“%lld\n”,R);
}
return 0;
}
建议先把代码格式化-
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,l,k;
//求1~x的二进制串有多少1
ll cal(ll x){
ll res=0;
x++;
for(ll i=0;i<=55;i++){
ll a=(1ll<<(i+1));
ll b=(1ll<<(i));
ll c=(x/a)*b+max(x%a-b,0ll);
res+=c;
}
return res;
}
int main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&l,&k);
k+=cal(l-1);//原来的k指的是从L开始的二进制串中的第k个1
ll L=0,R=1e16+1;//(<1>~的二进制串中的第k个1
while(L+1<R){
ll mid=(L+R)/2;
if(cal(mid)<k){
L=mid;
}
else{
R=mid;
}
}
printf("%lld\n",R);
}
return 0;
}
帮他格式化了
1 个赞
3克油
所以怎么做呢???
1 个赞
不知道
1 个赞
老师不是只教了45的吗?
1 个赞
但是我想AC
1 个赞
