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