[ARC143B] Counting Grids 题解
题目大意
将 \(1\sim n^2\) 填入 \(n\times n\) 的网格 \(A\) 中,对于每个格子满足以下条件之一:
该列中存在大于它的数。
该行中存在小于它的数。
求方案数。
思路分析
首先有一个比较显然的结论:对于一个不合法的方案,有且仅有一个数不满足任何一个条件。
考虑反证法,假设有两个数都不满足任何一个条件,设这两个数分别位于 \((x_1,y_1),(x_2,y_2)\),则有:\(A_{x_1,y_1}>A_{x_1,y_2}>A_{x_2,y_2}\),\(A_{x_2,y_2}>A_{x_2,y_1}>A_{x_1,y_1}\),存在矛盾,而多个数的情况可以归纳为两个数的情况,故结论成立。
正难则反,考虑计算不合法的方案数:
设不满足任何条件的数为 \(i\),考虑到 \(i\) 是所在列中最大的数,且是所在行中最小的数,故所在行的填法为 \(A_{n^2-i}^{n-1}\),所在列的填法为 \(A_{i-1}^{n-1}\),其他的地方随便填,一定满足条件,填法为 \((n-1)^2!\),再考虑 \(i\) 的位置,故得出不合法的方案数的计算式为:
\]
那么合法的方案数只需要用 \(n^2!\) 减一下就可以了。
如果预处理阶乘和阶乘逆元,那么计算的时间复杂度为 \(O(n^2)\)。
代码
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N=250100,V=250000,mod=998244353;
#define int long long
int fac[N],inv[N];
int n,ans;
int q_pow(int a,int b){
int res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int A(int n,int m){
if(n<m) return 0;
return fac[n]*inv[n-m]%mod;
}
signed main(){
scanf("%lld",&n);
int n2=n*n;
fac[0]=1;
for(int i=1;i<=n2;i++) fac[i]=fac[i-1]*i%mod;
inv[n2]=q_pow(fac[n2],mod-2);
for(int i=n2;i>=1;i--) inv[i-1]=inv[i]*i%mod;
for(int i=n;i<=n2-n+1;i++)
ans=(ans+A(n2-i,n-1)*A(i-1,n-1)%mod)%mod;
ans=(ans*fac[(n-1)*(n-1)]%mod)*n2%mod;
ans=(fac[n*n]-ans+mod)%mod;
cout<<ans<<'\n';
return 0;
}
[ARC143B] Counting Grids 题解的更多相关文章
- 【SP26073】DIVCNT1 - Counting Divisors 题解
题目描述 定义 \(d(n)\) 为 \(n\) 的正因数的个数,比如 \(d(2) = 2, d(6) = 4\). 令 $ S_1(n) = \sum_{i=1}^n d(i) $ 给定 \(n\ ...
- P4778 Counting Swaps 题解
第一道 A 掉的严格意义上的组合计数题,特来纪念一发. 第一次真正接触到这种类型的题,给人感觉好像思维得很发散才行-- 对于一个排列 \(p_1,p_2,\dots,p_n\),对于每个 \(i\) ...
- POJ 2386 Lake Counting 搜索题解
简单的深度搜索就能够了,看见有人说什么使用并查集,那简直是大算法小用了. 由于能够深搜而不用回溯.故此效率就是O(N*M)了. 技巧就是添加一个标志P,每次搜索到池塘,即有W字母,那么就觉得搜索到一个 ...
- CF908A New Year and Counting Cards 题解
Content 有 \(n\) 张卡牌,每张卡牌上只会有大小写字母和 \(0\sim 9\) 的阿拉伯数字.有这样一个描述:"如果卡牌正面写有元音字母(\(\texttt{A,E,I,O,U ...
- CF335E Counting Skyscrapers 题解
提供一种最劣解第一且巨大难写的做法( Bob 显然真正的楼量可以达到 \(314!\),是没办法直接做的,再加上唯一方案的样例,可以猜测有简单的结论. 考虑当楼高度为 \(k(k<h)\) 时, ...
- The 2013 South America/Brazil Regional Contest 题解
A: UVALive 6525 cid=61196#problem/A" style="color:blue; text-decoration:none">Atta ...
- Lyndon Word 与 Lydon 分解
\(\newcommand\m\mathbf\) \(\newcommand\t\texttt\) \(\text{By DaiRuiChen007}\) 约定: 对于两个字符串 \(S,T\),用 ...
- 【题解】Counting D-sets(容斥+欧拉定理)
[题解]Counting D-sets(容斥+欧拉定理) 没时间写先咕咕咕. vjCodeChef - CNTDSETS 就是容斥,只是难了一二三四五\(\dots \inf\)点 题目大意: 给定你 ...
- 【题解】晋升者计数 Promotion Counting [USACO 17 JAN] [P3605]
[题解]晋升者计数 Promotion Counting [USACO 17 JAN] [P3605] 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训.!牛是可怕的管理者! [题目描 ...
- 洛谷P3104 Counting Friends G 题解
题目 [USACO14MAR]Counting Friends G 题解 这道题我们可以将 \((n+1)\) 个边依次去掉,然后分别判断去掉后是否能满足.注意到一点, \(n\) 个奶牛的朋友之和必 ...
随机推荐
- 国产开源流批统一的数据同步工具Chunjun入门实战
@ 目录 概述 定义 特性 部署 安装 版本对应关系 通用配置详解 整体配置 Content 配置 Setting 配置 Local提交 Standalone提交 Json方式使用 SQL方式使用 M ...
- Day04_Java_作业
A:选择题 1.下列哪个答案与show不是方法重载(b ). class Demo { void show(int a,int b,float c){} } A.void show(int a,flo ...
- Java作业_Day21_
多线程 一.判断题(T为正确,F为错误),每题1分 1.如果线程死亡,它便不能运行.(T) 2.在Java中,高优先级的可运行线程会抢占低优先级线程.( T) 3.线程可以用yield方法使低优先级的 ...
- 2022-1-11 面板控件学习1 Canvas、WrapPanel、StackPanel、DockPanel、Grid
Canvas WrapPanel 让控件横向排列 StackPanel 控件竖向排列 DockPanel 自由布局,LastChildFill防止最后一个控件自动填充满 Grid 使用*和2*可以分配 ...
- 2021-7-7 VUE动态样式
Vue的动态样式实例1 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...
- 【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
问题描述 在前两篇文章中,创建了Disk + PV + PVC + POD 方案后,并且进入POD中增加文件. [Azure K8S | AKS]在AKS集群中创建 PVC(PersistentVol ...
- 一文理解GIT的代码冲突
对于GIT,不知道有没有人和我一样,很长时间都是小心翼翼.紧张兮兮,生怕一不小心,自己辛苦写的代码没了. 特别是代码冲突,更是难到我无法理解,每次都要求助于百度,跟着人家的教程一步步解决,下一次还是这 ...
- 微服务集成RabbitMq保姆级教程
本文通过简单的示例代码和说明,让读者能够了解微服务如何集成RabbitMq 之前的教程 https://www.cnblogs.com/leafstar/p/17641358.html 在这里我将介绍 ...
- python 获取本周 ,上周,本月,上月,本季,上季,今年, 去年的第一天和最后一天
import datetime from datetime import timedelta now = datetime.datetime.now()# 获取当前月的天数 month = 2days ...
- WPF学习 - 用鼠标移动、缩放、旋转图片(2)- 使用MatrixTransform
在上一篇文章中,提到了以鼠标控制变换图片的方法. 这种方法在某种情况下可以,例如,直接在windows窗体上.但我发现,当把它封装到一个控件中的时候,它就不行了. 经过不断的尝试,我找到了一种更简单的 ...