标签:res LL 网格 二维 base exp 鞍点 fact
如果一个二维网格中数据不重复,可以确定其鞍点最多有一个。
假设鞍点是列极大行极小,
则,与鞍点同行或同列的点显然不是鞍点,
与鞍点不同行列的点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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。