题解:AT_arc114_e [ARC114E] Paper Cutting 2
posted on 2025-02-26 13:07:51 | under | source
题意:一张 \(n\times m\) 的网格纸,\((x_1,y_1),(x_2,y_2)\) 是黑色其它白色。每次沿格线平行于边缘剪一刀,假如分开了两个黑色格子就结束,否则进入有黑色格子的部分继续进行,求期望次数。\(n,m\le 10^5\)。
原题这个切换纸的过程很烦,考虑换一个等价的随机方式。
trick:允许非法操作出现,但不算入期望。
在本题体现为等概率地选取任意一条线,假如是非法(即之前已经被剪掉了)就不算入操作次数。容易发现,一条合法线的概率与原先的随机方法一样!
由期望线性性,拆开来计算每条线合法的概率,记 \(cnt\) 为剪掉后这条线非法的线数量,注意包括剪开两个黑色格子的线,概率即为 \(\frac 1{cnt}\)。
\(O(n)\)。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int n, m, a, b, x, y, yyc, lby, _yyc, _lby, ans, cnt;
inline int qstp(int a, int k) {int res = 1; for(; k; a = a * a % mod, k >>= 1) if(k & 1) res = res * a % mod; return res;}
signed main(){
cin >> n >> m >> a >> b >> x >> y;
yyc = min(a, x) - 1, lby = max(a, x);
_yyc = min(b, y) - 1, _lby = max(b, y);
cnt = lby - yyc + _lby - _yyc - 2;
for(int i = 1; i <= yyc; ++i) ans = (ans + qstp(yyc - i + 1 + cnt, mod - 2)) % mod;
for(int i = lby; i < n; ++i) ans = (ans + qstp(i - lby + 1 + cnt, mod - 2)) % mod;
for(int i = 1; i <= _yyc; ++i) ans = (ans + qstp(_yyc - i + 1 + cnt, mod - 2)) % mod;
for(int i = _lby; i < m; ++i) ans = (ans + qstp(i - _lby + 1 + cnt, mod - 2)) % mod;
cout << (ans + 1) % mod;
return 0;
}

浙公网安备 33010602011771号