路径交点

题目链接:luogu P7736

题目大意

给你一个分层图,第一层和最后一层的点数相同。
然后要从第一层的 n 个点走到最后一层的 n 个点,每个点到达的位置互不相同。
然后问你偶数个交点的路径方案数比奇数个交点的路径方案数多多少个。

思路

不难发现一个事情,对于两个起点 si<sjs_i<s_jsi​<sj​,如果它们的终点有 ti<tjt_i<t_jti​<tj​,那么它相交的次数就是偶数次,否则就是奇数次。

这个其实不难理解,相交就两个的相对位置交换,那交换两次就相当于没有交换。

然后你会发现你如果把它压缩成走一步,你会发现就是要不相交,而且就是 LGV 引理的内容!

那我们就可以 DP 出从一个起点走到一个终点能有的路径数,然后用这个矩阵求行列式。
(其实这个 DP 可以当做是每两层之间的矩阵依次乘起来得到的矩阵)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define mo 998244353using namespace std;int T, k, n[101];
int x, y, m[101];
ll f[2][201][101], a[101][101];ll work() {//求行列式ll zf = 1, ans = 1, tmp;for (int i = 1; i <= n[1]; i++) {int k = i;for (int j = i + 1; j <= n[1]; j++)if (a[j][i] > a[k][i]) k = j;if (!a[k][i]) return 0;if (k != i) swap(a[i], a[k]), zf = -zf;for (int j = i + 1; j <= n[1]; j++) {if (a[i][i] < a[j][i]) swap(a[i], a[j]), zf = -zf;while (a[j][i]) {tmp = a[i][i] / a[j][i];for (int k = i; k <= n[1]; k++)a[i][k] = (a[i][k] + a[j][k] * (mo - tmp) % mo) % mo;swap(a[i], a[j]); zf = -zf;}}ans = ans * a[i][i] % mo;}if (zf == -1) return (-ans + mo) % mo;return ans;
}int main() {scanf("%d", &T);while (T--) {scanf("%d", &k);for (int i = 1; i <= k; i++) scanf("%d", &n[i]);for (int i = 2; i <= k; i++) {scanf("%d", &m[i]);}memset(f[1 & 1], 0, sizeof(f[1 & 1]));for (int i = 1; i <= n[1]; i++) f[1 & 1][i][i] = 1;for (int i = 2; i <= k; i++) {//DP 转移(其实也是矩阵相乘)memset(f[i & 1], 0, sizeof(f[i & 1]));for (int j = 1; j <= m[i]; j++) {scanf("%d %d", &x, &y);for (int k = 1; k <= n[1]; k++) {f[i & 1][y][k] += f[(i - 1) & 1][x][k];f[i & 1][y][k] %= mo;}}}for (int i = 1; i <= n[1]; i++)for (int j = 1; j <= n[k]; j++)a[i][j] = f[k & 1][j][i];printf("%lld\n", work());}return 0;
}

【luogu P7736】路径交点(LGV引理)(DP)(矩阵乘法)相关推荐

  1. 【bzoj3329】Xorequ 数位dp+矩阵乘法

    题目描述 输入 第一行一个正整数,表示数据组数据 ,接下来T行 每行一个正整数N 输出 2*T行 第2*i-1行表示第i个数据中问题一的解, 第2*i行表示第i个数据中问题二的解, 样例输入 1 1 ...

  2. P3193-[HNOI2008]GT考试【KMP,dp,矩阵乘法】

    正题 题目链接:https://www.luogu.com.cn/problem/P3193 题目大意 求有多少个长度为nnn的字符串不包含子串sss. 解题思路 考虑dpdpdp,用fi,jf_{i ...

  3. P5004-专心OI - 跳房子【dp,矩阵乘法】

    正题 题目链接:https://www.luogu.org/problemnew/show/P5004 题目大意 把NNN个无色格子排成一行,可以把某些格子染成黑色,但两个黑色格子之间必须至少有MMM ...

  4. 【BZOJ 3326】[Scoi2013]数数 数位dp+矩阵乘法优化

    挺好的数位dp-- 先说一下我个人的做法: 经过观察,发现这题按照以往的思路从后往前递增,不怎么好推,然后我就大胆猜想,从前往后推,发现很好推啊,维护四个变量,从开始位置到现在有了i个数 f[i]:所 ...

  5. 51nod1836-战忽局的手段【期望dp,矩阵乘法】

    正题 题目连接:http://www.51nod.com/Challenge/Problem.html#problemId=1836 题目大意 nnn个点mmm次随机选择一个点标记(可以重复),求最后 ...

  6. 【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)

    2323: [ZJOI2011]细胞 Description 2222年,人类在银河系外的某颗星球上发现了生命,并且携带了一个细胞回到了地球.经过反复研究,人类已经完全掌握了这类细胞的发展规律: 这种 ...

  7. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)

    题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...

  8. P7736-[NOI2021]路径交点【LGV引理】

    正题 题目链接:https://www.luogu.com.cn/problem/P7736 题目大意 有kkk层的图,第iii层有nin_ini​个点,每层的点从上到下排列,层从左到右排列.再给出连 ...

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

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

最新文章

  1. Java面向对象之继承,方法重写,super关键字,员工类系列继承题
  2. 行为模式之Observer模式
  3. wxWidgets:键码KeyCodes
  4. 激光炸弹(BZOJ1218)
  5. html和css可以用在ssh里面么,在网站中使用SSH
  6. 陷阱计算机音乐谱大全,陷阱 原版C调-王北车-和弦谱-《弹吧》官网tan8.com-和弦谱大全,学吉他,秀吉他...
  7. db2 最大分区数_db2 查询表分区数据库
  8. 五个很厉害的 CNN 架构
  9. Hibernate的持久化
  10. 2016年工作中遇到的问题1-10:select-for-update锁表
  11. 【学习总结】GirlsInAI ML-diary day-7-数据类型转换
  12. NLP+词法系列(二)︱中文分词技术简述、深度学习分词实践(CIPS2016、超多案例)
  13. Oracle 区管理和段空间管理小结
  14. winpe 卡巴斯基本升级内部错误
  15. Java画十字_用Java绘制对角线
  16. pandas用法-全网最详细教程
  17. Leetcode995 Minimum Number of K Consecutive Bit Flips解决方案
  18. 【C语言】数组和函数
  19. 最近一段时间的找工作计划
  20. 向中级程序员进击之路

热门文章

  1. ABP VNext学习日记16
  2. c语言中全局变量的设置
  3. MySQL万字总结!超详细!
  4. 点云处理——PCA主成分分析
  5. 读书-量子物理基础1
  6. 怎么将全局的变量清空
  7. P4956 [COCI2017-2018#6] Davor
  8. java-php-python-ssm计算机类在线学习管理系统计算机毕业设计
  9. 计算机网络总结(大全)
  10. 数据备份与恢复以及触发器介绍