LuoguP6861 [RC-03] 难题 题解

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)\) 的时候,答案是 \(126=2^7-2\)

由此我们发现:当有一个 \(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;
}

posted @ 2021-12-16 15:16  Eason_AC  阅读(91)  评论(0)    收藏  举报