再探模二意义下杨辉三角
从 https://codeforces.com/gym/101380/problem/C 谈起
关于本题:
1、题意:构造一个 \(n\times n\) 的 01 矩阵,让他的每一个顶着上顶边的子方阵的行列式模二意义下不为 0。
2、做法:
我们手搓第一行和第二行是唯一的,然后我们可以想到构造主对角线下的全部都为 0 ,这提示我们是否和三角分形有关,于是猜想杨辉三角满足性质,实际上是对的,附上代码。
点击查看代码
bool f[MAX][MAX];
signed main(){
freopen("determinant.in","r",stdin);
freopen("determinant.out","w",stdout);
f[1][0] = 1;
int n = rd();
repp(i,1,n){
repp(j,1,n){
f[i][j] = f[i-1][j]^f[i][j-1];
}
}
repp(i,1,n){
repp(j,1,n){
cout<<f[i][j]<<' ';
}cout<<endl;
}cout<<endl;
return 0;
}
正确性证明和更多扩展
证明
首先我们考虑左上角为 (1,1) 的方阵,事实上,其它方阵是可以归约到这种情况的,等会会说。
我们采取分类讨论+数学归纳法。(懒了,不想搞图片,随便记录一下大致思路)
首先我们解决一个较为简单的情况:n = 2^k。此时我们利用子结构容易证明(而且我们这里只能使用行变换,因为后面有需要)。
然后我们解决更一般情况:首先我们找到最小的 k 满足 2^k>n ,此时我们对前 \(2^{k-1}\) 用一般的消元方式去消元即可,此时会把这几行的后面的多余部分同时处理成比较友好的样子。用后面的,列变换一下消前面的,就把左下角那个子方阵独立出来,归纳到了更小的情况。于是我们完成了证明。
接下来说明为什么坐上角解决就足够了。
因为我们有 \(f_{i,j} = f_{i-1,j}+f_{i,j-1}\) ,所以我们有 \(f_{i,j} +f_{i-1,j} = f_{i,j-1}\)(这里是模二意义下加法),于是我们行之间差分,就相当于在平移我们的那个子矩阵,于是我们把问题都归约到了左上角为 (1,1) 的情况。
扩展
关于这题,我们还可以增量法构造,增量法甚至可以说明总共的构造方案是恰好 \(2^{\frac{n(n-1)}{2}}\) 种。而且我们的构造是关于主对角线对称的,所以对于子方阵贴着左边边线也是拥有这个性质的。而且更有趣的是,如果我们把这个条件加上,构造就唯一了!证明易证。

浙公网安备 33010602011771号