题意:
- 假设有一个数字矩阵,每次可以向下或向右,问从左上角走到右下角的数字和最多是多少,那么显然这是一个dp。
- 现在不问你数字和,而是把路径上的所有数都&起来,如果还是dp显然是错的。假设dp的到的结果是x,正确答案是y。
- 现在给定k,需要你构造一个矩阵,使得y-x = k;
题解:我们是不可能构造一个太大的矩阵,所以我们要从小开始考虑
迫使正确输出答案为k,Bob代码输出为0
假如这是一个2*2的矩阵,我们很容易想到他的代码是都可以成立的
那么2*3的矩阵呢?
假如ans是一个二进制位除最高位均0为很大的数,那么他的代码是肯定不成立的
ans+k k 0
ans ans+k k
思想就是先让初始值分化为一大一小值,让其代码按他取大,但是结果要取小值
为什么是1<<17,不能是1<<19或1<<16,其他均会错(卖个关子,仔细读读题)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int k;
cin >> k;
long long ans =1<<17;
cout<<2<<" 3\n";
cout<<ans+k<<" "<<k<<" "<<0<<"\n";
cout<<ans<<" "<<ans+k<<" "<<k;
}