数据不重复的二维网格中的鞍点数量问题
如果一个二维网格中数据不重复,可以确定其鞍点最多有一个。
假设鞍点是列极大行极小,
则,与鞍点同行或同列的点显然不是鞍点,
与鞍点不同行列的点z,可以对应,鞍点行列中的两个点x和y
且显然x<y(因为x<鞍点<y)
如果z<x,则z不为列极大,如果z>y,则z不为行极小,
如果x<z<y,则z不为列极大且不为行极小
即z不为鞍点。
如图所示:假设a是鞍点
* * * * * * *
* * * x * z *
* * * a * y *
* * * * * * *
* * * * * * *
例题:
https://atcoder.jp/contests/arc143/tasks/arc143_b
代码:(结合组合数,阶乘逆元递推问题)

#include<bits/stdc++.h> using namespace std; typedef long long LL; LL fact[250010]; LL inv_fact[250010]; LL MOD = 998244353; LL QuickPower(LL base, LL exp) { LL res = 1; while (exp) { if (exp & 1) { res *= base; res %= MOD; } base *= base; base %= MOD; exp >>= 1; } return res; } void YD() { LL n; cin >> n; fact[0] = 1; for (LL i = 1; i <= n * n; i++) { fact[i] = (fact[i - 1] * i) % MOD; } inv_fact[0] = 1; inv_fact[n * n] = QuickPower(fact[n * n], MOD - 2); for (LL i = n * n - 1; i >= 1; i--) { inv_fact[i] = inv_fact[i + 1] * (i + 1)%MOD; } cout << ((fact[n * n] - n * n %MOD * fact[n * n] % MOD * fact[n - 1] % MOD * fact[n - 1] % MOD * inv_fact[2 * n - 1] % MOD * 1 % MOD)%MOD+MOD)%MOD; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int T = 1; //cin >> T; while (T--) { YD(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人