P9552 题解

题目传送门

思路

对于 op=1op=1 的情况,我们先要求出 f(n,m)f(n,m) 的值,最优策略就是每一行、每一列都至少有一个格子被横穿,答案是 n+m1n+m-1

op=2op=2 的情况,最优策略就是 min(n,m)\min(n,m) 保持不变,让 max(n,m)\max(n,m) 去扩展即可。别忘了要开 long long,时时刻刻都要取模!

证明

为什么让 min(n,m)\min(n,m) 保持不变,让 max(n,m)\max(n,m) 去扩展就是最优策略了呢?因为原式是 n+m1=qn'+m'-1=q,转换一下变成 n+m=q+1n'+m'=q+1,这时我们要使 nmn'm' 最小,而我们知道两个数在和相同的情况下,两个数肯定是差距越大积才越小,所以我们就会使 nn'mm' 变成 min(n,m)\min(n,m)q+1min(n,m)q+1-\min(n,m)(不保证这是 nn'mm' 的顺序)。

代码

# include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll mod = 998244353;
int t, op;
ll n, m, q;
int main () {
	cin >> t;
	while (t --) {
		cin >> op >> n >> m;
		if (op < 2)
			cout << n + m - 1 << '\n';
		else {
			cin >> q;
			cout << min (n, m) % mod * ((q - n - m + 1) % mod) % mod << '\n';
		}
	}
	return 0;
}
posted @ 2023-08-17 20:07  Vitamin_B  阅读(10)  评论(0)    收藏  举报  来源