LuoguP6861 [RC-03] 難題 題解
阿新 • • 發佈:2021-12-16
LuoguP6861 [RC-03] 難題 題解
的時候,答案是 \(126=2^7-2\)。
Update
- \(\texttt{2020.10.21}\) 刪除了不需要的 \(n=1\) 的特判,並在符號與字母之間添加了空格。
Content
給定一個數 \(n\),試找到一對數 \(a,b(1\leqslant a,b\leqslant n)\),使得 \(a~or~b+a~xor~b\) 的值最大。
資料範圍:\(2\leqslant n\leqslant 10^{18}\)。
Solution
和月賽 T1 一樣是個找規律題。
我們先對 \(n=100\) 以內的答案通過打表得出來,先弄個打表程式:
#include <cstdio> #include <algorithm> using namespace std; int n, ans; int main() { for(n = 1; n <= 100; ++n) { ans = 0; for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) ans = max(ans, (i | j) + (i ^ j)); printf("When n = %d, ans = %d.\n", n, ans); } return 0; }
以下是得出來的結果,為了不佔太大版面,相同的答案就直接省略了。
When n = 1, ans = 1. When n = 2, ans = 6. When n = 3, ans = 6. When n = 4, ans = 14. ... When n = 7, ans = 14. When n = 8, ans = 30. ... When n = 15, ans = 30. When n = 16, ans = 62. ... When n = 31, ans = 62. When n = 32, ans = 126. ... When n = 63, ans = 126. When n = 64, ans = 254. ... When n = 100, ans = 254.
通過每一個 \(n\) 對應的答案我們就可以找到規律:
\((2=2^1)\leqslant n\leqslant (3=2^2-1)\) 的時候,答案是 \(6=2^3-2\)。
\((4=2^2)\leqslant n\leqslant (7=2^3-1)\) 的時候,答案是 \(14=2^4-2\)。
\((8=2^3)\leqslant n\leqslant (15=2^4-1)\) 的時候,答案是 \(30=2^5-2\)。
\((16=2^4)\leqslant n\leqslant (31=2^5-1)\) 的時候,答案是 \(62=2^6-2\)。
\((32=2^5)\leqslant n\leqslant (63=2^6-1)\)
由此我們發現:當有一個 \(i\) 滿足 \(2^i\leqslant n\leqslant 2^{i+1}\) 的時候,答案就是 \(2^{i+2}-2\)。所以,我們找到最小的 \(i\) 使得 \(n<2^i\),然後此時答案就是 \(2^{i+1}-2\)。注意,由於這裡的資料範圍是從 \(2\) 開始,所以不需要特判 \(n=1\) 的情況。
Code
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
long long n;
int main() {
scanf("%lld", &n);
for(int i = 1; ; ++i)
if(n < (long long)pow(2, i)) {
printf("%lld", (long long)pow(2, i + 1) - 2);
break;
}
return 0;
}