首页 > 其他分享 >[ARC143B] Counting Grids 题解

[ARC143B] Counting Grids 题解

时间:2023-07-26 19:45:09浏览次数:40  
标签:include Grids int 题解 times res Counting mod

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\times (n-1)^2!\times\sum_{i=n}^{n^2-n+1}A_{n^2-i}^{n-1}A_{i-1}^{n-1} \]

那么合法的方案数只需要用 \(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;
}

标签:include,Grids,int,题解,times,res,Counting,mod
From: https://www.cnblogs.com/TKXZ133/p/17583398.html

相关文章

  • [ABC308G] Minimum Xor Pair Query 题解
    MinimumXorPairQuery题目大意维护一个序列,支持动态插入,删除,查询最小异或对。思路分析看到查询最小异或对首先想到01Trie,但01Trie不支持删除,考虑暴力套一个线段树分治。需要预处理出每个元素的存活区间,这里使用了map<int,vector<int>>。注意,有的元素会存活到最后,需要特......
  • 网络瘤24题解+总结
    目录网络流24题太空飞行计划最大权闭合子图模型最小路径覆盖问题Trick总结网络流24题顺序主观决定太空飞行计划教训:(开始想费用流,搞半天出不来)网络流解决最大/小费用问题,要么最小割最大流,要么最小费用流最小费用流的前提是最大流,所以在有一些点可以不取换最优代价的时候,是......
  • P5369 [PKUSC2018] 最大前缀和 题解
    传送门题目大意给定一个序列,求任意重排\(n!\)中情况所以的最大非空前缀和的和。模\(998244353\)。\(n\e20\),\(\sum|a_i|\le10^9\)题目解析考虑最大前缀和的性质,有:对于最大前缀和部分,所有的真后缀大于等于零。(最大前缀和可能小于零)对于不在最大前缀和的后半部分,所......
  • [JOI 2022 Final] 自学 题解
    洛谷传送门1.题意简述:一个学期有\(N\)天\(N*M\)节课,每天的第\(i\)节课可以选择效果\(a_i\)的学习与\(b_i\)的自习。问应如何安排每节课,使所有功课最小值最大?2.思路:这道题想直接模拟非常麻烦,但是如果我们能够灵活运用二分算法,这道题就非常简单了。考虑到数据范围较......
  • luogu P9474 [yLOI2022] 长安幻世绘 详细题解
    原题:P9474[yLOI2022]长安幻世绘看到很多大佬的题解直接讲了做法,本蒟蒻看得不是很懂,调了很久才把这题做出来,于是写了这篇比较详细的题解谈一下我做这题从头到尾的思路,希望对各位有帮助qwq。思路我们首先思考这样一个问题,如果已经知道最终答案对应的最大值和最小值,又不知道题......
  • AT_agc017_b 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法,请放心阅读。题目简述一共有\(n\)个格子,给定两个整数\(A,B\)分别位于第\(1\)和第\(n\)格,中间有\(n−2\)个空格。询问是否存在一种填数方案满足任意相邻两个数之差的绝对值在\([C,D]\)之间。依次输入\(n,a,b,c,d\)......
  • AT_arc149_a 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述求满足以下条件的小于\(10^n\)数最大是多少?每一位数字均相同;是\(m\)的倍数。数据范围:\(1\len\le10^5\),\(1\lem\le10^9\)。思路首先每位数字都相同很好满足,仅需......
  • 题解:【ICPC WF 2021 L】 Where Am I?
    题目链接这年WF较为简单的一道了,直接模拟即可。首先可以预处理出它顺时针螺旋轨迹的移动步数,方便过会算距离直接查表。我偷懒直接用map记录的距离表,这样不用处理复数下标的问题。注意到\(X\)的数量不会超过\(100\)个,所以我们可以反过来从标记点上入手。找出所有的标记点,......
  • 洛谷 P2894 [USACO08FEB] Hotel G 题解
    题目链接P2894[USACO08FEB]HotelG-洛谷|计算机科学教育新生态(luogu.com.cn)分析考虑用线段树维护区间信息维护sum(最大连续空房间数)如何合并?sum1为max(sum2,sum3)(1的两个子区间)但我们发现若区间为100001(0表示空房间)sum1=4而max(sum2,sum3)=2所以再维护suml(从左开始的......
  • 网络并发每日习题解释版
    网络并发每日习题解释版1.软件开发架构类别软件开发架构类别:软件开发架构是指在软件设计和开发过程中,用于组织和管理软件系统的基本结构。常见的软件开发架构类别包括:分层架构(LayeredArchitecture):将软件系统划分为多个相互独立的层,每个层都有特定的功能和责任。客户端......