这是昨晚CF D的题解:
首先,我们来计算一下目前不同类型山峰之间的高度差,记作 D 。
然后,对于每个大小为 k×k 的子矩阵,我们将计算不同类型山脉高度之和的差值是如何变化的。也就是说,对于每个子矩阵,我们将计算其中 0 和 1 的数量差异,让这些值为 di ,然后会有 q=(n−k+1)⋅(m−k+1) 。这可以通过二维前缀和或 "滑动窗口 "来实现。
之后,我们可以正式写出下面的等式:
c1⋅d1+c2⋅d2+⋯+cq⋅dq=D
其中 c1 , c2 , ..., cq - 是尼基塔为特定子矩阵选择的常数 c (如果我们不使用该子矩阵变换,则为 0 )。这与 Diophantine 方程非常相似,事实上也是如此,只不过有 q 个未知数。
关于这个方程在整数中是否存在解?为此,只要
Dmodgcd(d1,d2,…,dq)=0
值得一提的是,有必要仔细处理所有 di=0 的情况,同时也不要忘记 D 最初等于 0 的情况。
总之,解在 O(n⋅m+logA) 中。
我就是不太明白,为什么
c1⋅d1+c2⋅d2+⋯+cq⋅dq=D
只要
Dmodgcd(d1,d2,…,dq)=0
就有解?
是什么定理吗?还是怎么推的?