CodeForces 1332D - Walk on Matrix【构造】
题意:
构造一个矩阵,使得从左上角到右下角实际的最大值比题目提供的 \(dp\) 方法大 \(k\)。
分析:
使得 \(dp\) 所求出的最大值为 \(0\),实际最大值为 \(k\)。
对于矩阵:
\[ \left[
\begin{matrix}
a_{1,1} & a_{1,2} \\
a_{2,1} & a_{2,2}
\end{matrix}
\right]
\]
按照题目给的 \(dp\) 的做法,
\(a_{2,2}=max\{a_{1,1}\&a_{1,2}\&a_{2,2}\ ,\ a_{1,1}\&a_{2,1}\&a_{2,2}\}\)
构造矩阵:
\[ \left[
\begin{matrix}
x \bigoplus k & x \\
k & x \bigoplus k
\end{matrix}
\right]
\]
有:\(a_{2,2}=max\{(x \bigoplus k)\&x,(x \bigoplus k)\&k \}\)
又因为有:\((x \bigoplus k)\&x \&k=0\)
在原有矩阵的基础上进行修改:
\[ \left[
\begin{matrix}
x \bigoplus k & x & 0\\
k & x \bigoplus k & k
\end{matrix}
\right]
\]
所以我们要使的 \((x \bigoplus k)\&x > (x \bigoplus k)\&k\),才能保证按 \(dp\) 做法求出的结果为 \(0\)。
那么 \(x\) 的取值就很关键。\(x\) 应该取比 \(k_{max}\) 大且为 \(2\) 的整数次幂,如 \(2^{17}\)。
所以 \(dp\) 取得的最大值为 \((x \bigoplus k)\&x \&k=0\)
实际最大值为 \((x^k)\&k=k\)。
最终矩阵为:
\[ \left[
\begin{matrix}
2^{17} \bigoplus k & 2^{17} & 0\\
k & 2^{17} \bigoplus k & k
\end{matrix}
\right]
\]
代码:
C++:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int k;
scanf("%d",&k);
printf("2 3\n");
int x=1<<17;
printf("%d %d %d\n",x^k,x,0);
printf("%d %d %d\n",k,x^k,k);
return 0;
}
python:
k=int(input())
print("2 3\n")
x=1<<17
print(x^k,x,0)
print(k,x^k,k)