数据不重复的二维网格中的鞍点数量问题
作者:互联网
如果一个二维网格中数据不重复,可以确定其鞍点最多有一个。
假设鞍点是列极大行极小,
则,与鞍点同行或同列的点显然不是鞍点,
与鞍点不同行列的点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; }View Code
标签:res,LL,网格,二维,base,exp,鞍点,fact 来源: https://www.cnblogs.com/ydUESTC/p/16419964.html