题解: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;
}
posted @ 2026-01-15 08:14  Zwi  阅读(3)  评论(0)    收藏  举报