求助ABC E
  • 板块学术版
  • 楼主Chancylaser
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/9/23 22:58
  • 上次更新2023/11/2 18:25:05
查看原帖
求助ABC E
241817
Chancylaser楼主2023/9/23 22:58

第二个样例后三个数据不对

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long LL;
const int N=2e5+5,INF=8e18;

int T;
int n,x,k;
int nd;

int Get(int p){
	if(p>n || p==0) return 0;
	if(!k) return 1;
	
	int nw;
	int l=INF,r=INF;
	nw=p;
	for(int i=1;i<=k;i++){
		nw*=2;
		if(nw>n) break;
	}
	int po=log2(nw);
	if(po-nd==k && nw<=n) l=nw;
	if(l==INF) return 0;
	
	nw=p;
	for(int i=1;i<=k;i++){
		nw=nw*2+1;
		if(nw>n) break;
	}
	po=log2(nw);
	if(po-nd==k){
		if(nw>n) nw=n,r=n;
		else r=nw;
	}
	
	if(l<=r && l!=INF && r!=INF)
		return r-l+1;
	return 0;
}

signed main(){	
	cin>>T;
	
	while(T--){
		cin>>n>>x>>k;
		nd=log2(x);
		
		int ans=Get(x); 
		int lst; k--;
		
		if(k<0){
			cout<<ans<<"\n";
			continue;
		}
		
		while(x>=1){
			lst=x;
			x/=2; 
			if(!x) break;
			if(!k){
				ans++;
				break;
			}
			k--; 
			if(lst&1) ans+=Get(x*2);
			else ans+=Get(x*2+1);
			nd--;
		}
		
		cout<<ans<<"\n";
	}
	return 0;
}

2023/9/23 22:58
加载中...