列表

详情


NC202230. 牛牛要女装

描述

    牛妹想要牛牛女装,但是众所周知,女装的开始都是需要一个被逼无奈的理由。所以牛牛现在缺一个机会,因此他对着牛妹立了一个flag(这是不易察觉的阴谋)。

    牛牛告诉牛妹如果你能解决我提出的问题,我就当场女装道理。为了让牛牛顺理成章的女装,牛妹当然必须答应。

    这个问题是这样的,给定一个长度为的序列,我们通过函数来生成这个序列。但是你需要回答次询问,每次询问长度为的序列中,第个数是多少。回答完这个询问牛牛就当场女装,所以大家加油!

输入描述

第一行一个整数表示你需要回答的询问数量.

接下来每行两个整数.

输出描述

对于每个询问回答的第个数是什么.


示例1

输入:

2
10 2
5 1

输出:

4
4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 189ms, 内存消耗: 3552K, 提交时间: 2020-03-01 16:27:41

#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
ull n, m, q;
ull solve(ull n, ull m) {
	ull hi = 1ull << std::__lg(n);
	if (m == 0) return hi;
	if (m < hi) {
		return solve(hi - 1, m - 1);
	}
	return hi + solve(n - hi, m - hi);
}

int main() {
	cin >> q;
	while (q--) {
		cin >> n >> m;
		cout << solve(n, m- 1) << endl;
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 67ms, 内存消耗: 1516K, 提交时间: 2020-02-21 23:07:15

#include <cstdio>
#include <iostream>
#define ull unsigned long long
using namespace std;
ull q,n,m;
ull f(ull n,ull m)
{
	ull tmp=1ull<<__lg(n);
	if(m==0)
	{
		return tmp;
	}
	if(m<tmp)
	{
		return f(tmp-1,m-1);
	}
	return tmp+f(n-tmp,m-tmp);
}
int main()
{
	scanf("%llu",&q);
	while(q--)
	{
		scanf("%llu%llu",&n,&m);
		printf("%llu\n",f(n,m-1));
	}
	return 0;
}

上一题