[题解]CF2092E She knows...
挺有意思的一个题。
思路
在下文中,记 \(col_{x,y} = \operatorname{color}(x,y)\)。
因为颜色只有 \(0,1\),那么 \(|A|\) 等于相邻两个位置 \((x_1,y_1),(x_2,y_2)\) 满足 \(col_{x_1,y_1} + col_{x_2,y_2} \equiv 0 \pmod 2\) 的数量。
我们需要满足 \(|A| \bmod 2 = 0\),即满足 \(\sum_{x_1 \leq x_2 \wedge y_1 \leq y_2 \wedge |x_1 - x_2| + |y_1 - y_2| = 1}col_{x_1,y_1} + col_{x_2,y_2} \equiv 0 \pmod 2\)。
考虑一个点 \((x,y)\) 的 \(col_{x,y}\) 会做贡献的次数。注意到若 \(x = 1 \vee x = n \vee y = 1 \vee y = m\) 并且 \((x,y) \neq (1,1),(1,m),(n,1),(n,m)\),贡献的次数为 \(3\);其余位置的点贡献次数均为偶数。这意味着只有前者的颜色会对最后 \(|A|\) 的值有影响,其余位置的点都可以任选颜色。
记被钦定颜色的满足 \(x = 1 \vee x = n \vee y = 1 \vee y = m\) 并且 \((x,y) \neq (1,1),(1,m),(n,1),(n,m)\) 的点的数量为 \(cnt\),它们的颜色和为 \(sum\),则:
- 若 \(cnt = 2 \times (n + m - 4)\):
- 若 \(sum \equiv 0 \pmod 2\),答案为 \(2^{nm - k}\)(除了这 \(k\) 个点的颜色都可以任选)。
- 否则,答案为 \(0\)。
- 否则,答案为 \(2^{nm - k - 1}\)(当边缘的点只剩下一个没有被填颜色,那么这个点的颜色已经被确定,因为需要满足边缘点的颜色和为偶数)。
Code
#include <bits/stdc++.h>
#define re register
#define int long long
#define Mul(a,b) ((a) * (b) % mod)
#define chMul(a,b) (a = Mul(a,b))
using namespace std;
const int mod = 1e9 + 7;
int n,m,k;
inline int read(){
int r = 0,w = 1;
char c = getchar();
while (c < '0' || c > '9'){
if (c == '-') w = -1;
c = getchar();
}
while (c >= '0' && c <= '9'){
r = (r << 3) + (r << 1) + (c ^ 48);
c = getchar();
}
return r * w;
}
inline int qmi(int a,int b){
int res = 1;
while (b){
if (b & 1) chMul(res,a);
chMul(a,a); b >>= 1;
} return res;
}
inline void solve(){
int cnt = 0,sum = 0;
n = read(),m = read(),k = read();
for (re int i = 1,x,y,c;i <= k;i++){
x = read(),y = read(),c = read();
if ((x == 1) + (x == n) + (y == 1) + (y == m) == 1) cnt++,sum += c;
}
if (cnt == 2 * (n + m - 4)){
if (sum & 1) puts("0");
else printf("%lld\n",qmi(2,n * m - k));
}
else printf("%lld\n",qmi(2,n * m - k - 1));
}
signed main(){
int T; T = read();
while (T--) solve();
return 0;
}

浙公网安备 33010602011771号