CodeForces 1332D

题意:

构造一个矩阵,使得从左上角到右下角实际的最大值比题目提供的 (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)
原文地址:https://www.cnblogs.com/1024-xzx/p/12637820.html