题目链接:点击这里

题目大意:
有一个 n×nn\times nn×n 的棋盘,左下角为 (1,1)(1,1)(1,1),右上角为 (n,n)(n,n)(n,n),若一个棋子在点 (x,y)(x,y)(x,y),那么走一步只能走到 (x+1,y)(x+1,y)(x+1,y) 或 (x,y+1)(x,y+1)(x,y+1)。

现在有 mmm 个棋子,第 iii 个棋子一开始放在 (ai,1)(a_i,1)(ai​,1),最终要走到 (bi,n)(b_i,n)(bi​,n) 。问有多少种方案,使得每个棋子都能从起点走到终点,且对于所有棋子,走过路径上的点互不相交。输出方案数 mod998244353\bmod\ 998244353mod 998244353 的值。

两种方案不同当且仅当存在至少一个棋子所经过的点不同。

题目分析:
LGVLGVLGV 引理:
GGG 是一个有限的带权有向无环图。每个顶点的度是有限的,不存在有向环(所以路径数量是有限的)。
起点 A={a1,⋯,an}A=\{a_1,\cdots,a_n\}A={a1​,⋯,an​},终点 B={b1,⋯,bn}B=\{b_1,\cdots,b_n\}B={b1​,⋯,bn​}。
每条边 eee 有权 wew_ewe​ ,并假定值属于某交换环 。
对于一个有向路径 PPP,定义 ω(P)\omega(P)ω(P) 为路径上所有边权的积。
对任意顶点 aaa,bbb ,定义 e(a,b)=∑P:a→bω(P)e(a,b)=\sum\limits_{P:a \to b}{\omega(P)}e(a,b)=P:a→b∑​ω(P) 。
设矩阵
M=(e(a1,b1)e(a1,b2)⋯e(a1,bn)e(a2,b1)e(a2,b2)⋯e(a2,bn)⋮⋮⋱⋮e(an,b1)e(an,b2)⋯e(an,bn))M= \begin{pmatrix} e(a_1,b_1) & e(a_1,b_2) & \cdots & e(a_1,b_n) \\ e(a_2,b_1) & e(a_2,b_2) & \cdots & e(a_2,b_n) \\ \vdots & \vdots & \ddots & \vdots \\ e(a_n,b_1) & e(a_n,b_2) & \cdots & e(a_n,b_n) \\ \end{pmatrix}M=⎝⎜⎜⎜⎛​e(a1​,b1​)e(a2​,b1​)⋮e(an​,b1​)​e(a1​,b2​)e(a2​,b2​)⋮e(an​,b2​)​⋯⋯⋱⋯​e(a1​,bn​)e(a2​,bn​)⋮e(an​,bn​)​⎠⎟⎟⎟⎞​
那么 AAA 到 BBB 的所有不相交的路径条数为 det⁡(M)\det(M)det(M)

对于本题:
由于是求方案数所以可以把边权抽象成 111
e(ai,bj)e(a_i,b_j)e(ai​,bj​) 可以利用排列组合来计算,就是从 (ai,1)(a_i,1)(ai​,1) 走到 (bj,n)(b_j,n)(bj​,n) 的方案数,即 Cbj−ai+n−1n−1C_{b_j-a_i+n-1}^{n-1}Cbj​−ai​+n−1n−1​
然后套一个高斯消元求行列式即可
时间复杂度为 O(n+m3)O(n+m^3)O(n+m3)

具体细节见代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
//#define int  ll
#define endl '\n'
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
using namespace std;
int read()
{int res = 0,flag = 1;char ch = getchar();while(ch<'0' || ch>'9'){if(ch == '-') flag = -1;ch = getchar();}while(ch>='0' && ch<='9'){res = (res<<3)+(res<<1)+(ch^48);//res*10+ch-'0';ch = getchar();}return res*flag;
}
const int maxn = 2e6+5;
const int mod = 998244353;
const double pi = acos(-1);
const double eps = 1e-8;
int n,m,a[maxn],b[maxn],fac[maxn],inv[maxn],mat[105][105];
int qpow(int a,int b)
{int res = 1;while(b){if(b&1) res = (ll)res*a%mod;a = (ll)a*a%mod;b >>= 1;}return res;
}
int Gauss(int a[][105],int n,const int p) // 求行列式
{int res = 1;for(int i = 1;i <= n;i++){int pos = i;for(int j = i+1;j <= n;j++)if(a[j][i] > a[pos][i]) pos = j;if(!a[pos][i]) return 0;if(i^pos) swap(a[i],a[pos]),res *= -1;for(int j = i+1;j <= n;j++){if(a[j][i] > a[i][i]) swap(a[j],a[i]),res *= -1;while(a[j][i]){int tmp = a[i][i]/a[j][i];for(int k = i;k <= n;k++)a[i][k] = (a[i][k]+(ll)(p-tmp)*a[j][k])%p;swap(a[j],a[i]),res *= -1;}}}for(int i = 1;i <= n;i++) res = (ll)res*a[i][i]%p;return (res+p)%p;
}
int C(int n,int m)
{if(n < m) return 0;return (ll)fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int main()
{fac[0] = 1;for(int i = 1;i < maxn;i++) fac[i] = (ll)fac[i-1]*i%mod;inv[maxn-1] = qpow(fac[maxn-1],mod-2);for(int i = maxn-1;i;i--) inv[i-1] = (ll)inv[i]*i%mod;int t = read();while(t--){n = read(),m = read();for(int i = 1;i <= m;i++) a[i] = read(),b[i] = read();for(int i = 1;i <= m;i++)for(int j = 1;j <= m;j++) mat[i][j] = C(b[j]-a[i]+n-1,n-1);cout<<Gauss(mat,m,mod)<<endl;}return 0;
}

P6657 【模板】LGV 引理相关推荐

  1. 【luogu P6657】【模板】LGV 引理(行列式)(数学)(线性代数)

    [模板]LGV 引理 题目链接:luogu P6657 题目大意 给你一个二维图,然后分别有 m 个棋子,分别要从 (ai,1) 走到 (bi,n),只能从 (x,y) 走到 (x+1,y) 和 (x ...

  2. 模板:LGV引理(线性代数)

    所谓LGV引理,就是解决LGV问题的引理. (逃) 前言 上联:古有学完SAM学PAM: 下联:今有学完Polya学LGV: 横批:小清新. 常被用于有向图不交路径计数问题.(废话) 这个东西是真的不 ...

  3. 【2022国赛模拟】无损加密——LGV引理、状压DP

    原创题无来源 题目描述 题解 首先把问题稍作简化,我们可以最后把行列式乘上所有 dkd_kdk​ 的积的 nnn 次方,这样前面的过程就不用考虑 dkd_kdk​ 了,暴力也只需要变动 [lk,rk] ...

  4. 2021牛客暑期多校训练营9 Cells(LGV引理,FFT)

    2021牛客暑期多校训练营9 Cells(LGV引理,FFT) 题目链接 题意 在一个无限大的xyxyxy​坐标轴上,求从A={(0,a1),(0,a2),...,(0,an)}A=\{(0,a_1) ...

  5. CF348D LGV引理

    题意: 给定一张图,图上存在障碍点,两个人从(1,1)(1,1)(1,1)出发,只能向上或向右走,走到(n,m)(n,m)(n,m)且路径不相交的方案数 数据范围:1≤n,m≤30001\le n,m ...

  6. 【luogu P7736】路径交点(LGV引理)(DP)(矩阵乘法)

    路径交点 题目链接:luogu P7736 题目大意 给你一个分层图,第一层和最后一层的点数相同. 然后要从第一层的 n 个点走到最后一层的 n 个点,每个点到达的位置互不相同. 然后问你偶数个交点的 ...

  7. 2018牛客多校第一场 Monotonic Matrix (LGV引理)

    链接:https://www.nowcoder.com/acm/contest/139/A 来源:牛客网 题目描述 Count the number of n x m matrices A satis ...

  8. LGV 引理——二维DAG上 n 点对不相交路径方案数

    文章目录 引入 简介 定义 引理 证明 例题 释疑 扩展 引入 有这样一个问题: 甲和乙在一张网格图上,初始位置 (x1,y1),(x2,y2)(x_1,y_1),(x_2,y_2)(x1​,y1​) ...

  9. P6657-[模板]LGV 引理

    正题 题目链接:https://www.luogu.com.cn/problem/P6657 题目大意 给出n×nn\times nn×n的棋盘,mmm个起点第iii个为(1,ai)(1,a_i)(1 ...

最新文章

  1. RxSwift UI控件扩展
  2. Python文件的两种用途
  3. 老师们的神操作,但凡有一个是我的老师,我必定能上清华
  4. 【faster rcnn 实现via的自动框人】使用detectron2中faster rcnn 算法生成人的坐标,将坐标导入via(VGG Image Annotator)中,实现自动框选出人的区域
  5. Hibernate的出现和Hinbernate的简单模拟实现
  6. 详解Python中的浅复制与深复制
  7. pythonlist循环添加元素_list.append()在for循环中每次添加的都是最后的一个元素汗血宝马...
  8. GetlastError()函数返回值
  9. css3技巧——产品列表之鼠标滑过效果(一)
  10. 计算机原理中的cps,信息物理融合系统(cps)原理pdf
  11. WEB UI设计尺寸规范
  12. MRP专题二:计划策略(MTS)
  13. c语言编译器中cu是什么意思,.c文件调用.cu中的函数
  14. 别傻干了,刚离职的同事分享了他常用的19个私活平台!
  15. 浅聊关于vue.js
  16. android------之高德地图实现定位和3D地图显示
  17. 谷歌浏览器和火狐浏览器的12px字体显示大小不一样
  18. CodeForces - 1004B - Sonya and Exhibition(纯思维题)
  19. CTime和CTimeSpan
  20. react引入d3相关问题

热门文章

  1. Win10 使用笔记
  2. 手机网站制作:PC网站怎么转成手机网站
  3. 梯度下降法求解多元线性回归 — NumPy
  4. mysql随机取出每个分组前2条记录
  5. 为什么许多公司电脑系统都是win10家庭版而不是专业版?
  6. 移植tcpdump到ARM嵌入式系统
  7. 《码农翻身》--知识点总结--01我是一个线程---线程生命周期、线程池、缓存、锁
  8. 盛世昊通官宣上市美国纳斯达克,产业链协同更加国际化
  9. 正确认识区块链与元宇宙的关系
  10. 小程序调起付款码API