题目大意

给定在n*m的网格中,每个格子有一个高度,每次可以做如下两个操作:

  1. 使某个点的高度增加2
  2. 使两个相邻的格子的高度增加1
    问 满足可以经过这两个操作使得所有高度相同的初始矩阵有多少个?(所有格子内的数的范围在[L,R]区间。)

题解

Observation1: 原方格只有奇,偶对结果有影响。
Proof: 发现可以先用操作1使某些数加一些2,其实就像等于让别的数减2(高度差不影响),所以最终所有数都是1或者0,即奇偶有关,且无需考虑操作1.(只要让所有数奇偶相等即可)

Observation2: 可以任意改变矩阵中某两个格子的奇偶。
Proof: 对两个格子的路径上的所有点都进行操作2,便可以达成目标。

Obervation3: n乘m 是奇数的时候恒成立,且n乘m是偶数的时候只有格子高度是偶数的格子是偶数个的时候才成立。
Proof: 由观察2可知每次只会改变两个格子的奇偶,所以n乘m是奇数时,必定存在偶数个奇数高度的格子或者偶数个偶数高度的格子。 同理对n乘m是偶数。

如何算呢?

因为所有数在[L,R],其实可以转化到在[0,k](k=R-L)间
E是[0,k]中偶数的个数,O是奇数的个数。

对于n乘m是奇数来说答案就是图片说明
对于n乘m是偶数时:图片说明
又发现

两式相加/2就是答案
类似题目:https://www.acwing.com/solution/AcWing/content/10465/

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int n,m,l,r,k;

int qpow(int p,int q) {
    return (q&1?p:1) * (q?qpow(p*p%mod,q/2):1) % mod;
}

signed main() {
    cin>>n>>m>>l>>r;
    k=r-l+1;
    if(n*m%2) cout<<qpow(k,n*m);
    else if(k&1) cout<<(qpow(k,n*m)+1)*((mod+1)/2)%mod;
    else cout<<(qpow(k,n*m))*((mod+1)/2)%mod;
}