数据不重复的二维网格中的鞍点数量问题

如果一个二维网格中数据不重复,可以确定其鞍点最多有一个。

假设鞍点是列极大行极小,

则,与鞍点同行或同列的点显然不是鞍点,

与鞍点不同行列的点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
复制代码

 

posted @   80k  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示