Codeforces Round #630 (Div. 2)
作者:互联网
比赛链接:
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;
}
标签:630,奇数,LL,奇偶性,Codeforces,偶数,ans,操作,Div 来源: https://www.cnblogs.com/Hamine/p/16265184.html