题意:
一个 n ∗ m n*m n∗m 的网格图上的每个网格初始放有高度在 l r l~r l r 范围内的立方体木块。你每次能在这个网格图中选择一个位置加上 2 2 2 个立方体木块,或者选择两个相邻位置各加上 1 1 1 个木块,询问有几种初始状态能够经过有限次操作是的所有位置的木块高度一致。
因为不论怎么操作,都是给现有的方块堆加上 2 2 2 个方块,因此奇偶性不变。我们假设初始最高的一堆木块高度为 h h h ,如果最终能够使得所有位置高度一致,则需要满足: ( n m k + ( n m h − ∑ p o s i j ) ) % 2 = 0 (nmk+(nmh−∑pos_{ij}))\%2=0 (nmk+(nmh−∑posij))%2=0 ,其中 p o s i j pos_{ij} posij 指代网格图中位置为 ( i , j ) (i,j) (i,j) 的方块数。
不难发现如果 n m nm nm 为奇数,则上式必然能成立,则方案数为 ( r − l + 1 ) n m (r−l+1)nm (r−l+1)nm ;若 n m nm nm 为偶数,则能否变成高度一致取决于 n m h − ∑ p o s i j nmh−∑pos_{ij} nmh−∑posij 的奇偶性,又因为此时 n m nm nm 为偶数,因此初始的总方块数若为奇数就必定不行,我们减去初始方块数为奇数的情况即为答案。
AC代码:
const ll mod = 998244353;
ll n, m, l, r;
ll ans, res, tmp, inv;
int main()
{
sldd(n, m);
sldd(l, r);
if (l == r)
{
puts("1");
return 0;
}
if (n * m & 1)
{
ans = qpow(r - l + 1, n * m, mod);
pld(ans);
return 0;
}
inv = qpow(2, mod - 2, mod);
res = (r - l + 1) / 2;
tmp = (r - l + 1) - res;
ans = (qpow(tmp + res, n * m, mod) + qpow(res - tmp, n * m, mod)) * inv % mod;
pld(ans);
return 0;
}