比赛链接:

https://codeforces.com/contest/1332

E. Height All the Same

题目大意:

\(n * m\) 的矩形区域内,每个点上的高度处在 \([l, r]\),有两种操作:
操作 1,选择一个位置 \((i, j)\),让该位置高度 + 2。
操作 2,选择两个相邻的位置,两个位置高度都 + 1。
问有多少种情况,通过若干次操作后可以让最后的高度相同。

思路:

奇偶性考虑,操作 1 不改变一个位置高度的奇偶性,操作 2 让两个相邻的位置奇偶性改变。
设区域内高度为奇数个的有 \(odd\) 个,偶数个的有 \(even\) 个。
如果 \(n * m\) 是奇数的话,显然,\(odd\)\(even\) 的奇偶性一定不同,那就可以通过操作 2 让奇偶性转化,所以所有情况都是可以的,答案为 \((r - l + 1)^{n * m}\)
如果 \(n * m\) 是偶数的话,\(odd\)\(even\) 都是奇数的时候是没办法相互转化的,所以两个都要是偶数的情况, \([l, r]\) 中奇数有 \(x\) 个,偶数有 \(y\) 个,所有的组合就是 \(\sum_{i = 0, 2, 4, ...}^{n} C_{n * m}^{i} x^i y^{n * m - i}\)
这个式子就是二项式定理中偶数项的和,所以转化为 \(\frac{(x + y)^{n * m} + (x - y)^{n * m}}{2}\)

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int mod = 998244353;
LL n, m, l, r;
LL qp(LL a, LL k, LL p){
	LL ans = 1;
	while (k){
		if (k & 1) ans = ans * a % p;
		k >>= 1;
		a = a * a % p;
	}
	return ans;
}
int main(){
	cin >> n >> m >> l >> r;
	if (n * m % 2 == 1) cout << qp(r - l + 1, n * m, mod) << "\n";
	else{
		LL y = r / 2 - (l - 1) / 2, x = (r - l + 1) - even;
		cout << ( qp(x + y, n * m, mod) + qp(x - y, n * m, mod) ) % mod * qp(2, mod - 2, mod) % mod << "\n";
	}
	return 0;
}
posted on 2022-05-13 01:03  Hamine  阅读(22)  评论(1编辑  收藏  举报