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; }