其他分享
首页 > 其他分享> > 数据不重复的二维网格中的鞍点数量问题

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

作者:互联网

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

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

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

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