今晚abcE求调
  • 板块学术版
  • 楼主truly_handsome
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/9/23 21:51
  • 上次更新2023/11/2 18:25:45
查看原帖
今晚abcE求调
334554
truly_handsome楼主2023/9/23 21:51
# include <bits/stdc++.h>
# define int long long
using namespace std;

int n, x, k;

void solve(){
	scanf("%lld%lld%lld", &n, &x, &k);
	int m = x, num = 1, ans = 0;
	int l = x, r = x;
	for (register int i = 1;i <= k;i++){
		l = l*2; r = r*2+1;
		if (l > 2e18) l = 2e18;
		r = min(r, n);
	}
	ans += max(0ll, r-l+1);
  // 先统计它子树内的
  // 再一次一次往上跳
	while (num <= k && m >= 2){
		if (num == k){
			ans++; break;
		}
		int tmp = 1;
      // tmp:兄弟节点
		if (m & 1) tmp = (m / 2) * 2;
		else tmp = (m / 2) * 2 + 1;
		l = tmp, r = tmp;
		for (register int i = 1;i <= k-num-1;i++){
			l = l*2; r = r*2+1; 
			if (l > n) l = n+1;
			if (r > n) r = n;
		}
		ans += max(0ll, r-l+1);
		num++; m /= 2;
	}
	printf("%lld\n", ans);
}

signed main(){
	int T; scanf("%lld", &T);
	while (T--) solve();
	return 0;
}


T 了不用管,样例二的最后一个点错了

2023/9/23 21:51
加载中...