求大神帮我TLE45


我的代码:#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 个赞