P7736 [NOI2021] 路径交点
P7736 [NOI2021] 路径交点
题意
给一个分层 DAG,起点和终点(第一层和最后一层)数量相同,要求路径没有公共点。问所有路径方案中,\(偶数交点方案数-奇数交点方案数\) 是多少。
思路
对于相邻两层,我们每层各选择 \(n\) 个点。题目说的“交点数”其实就是排列的逆序对数。建邻接矩阵,边权为 \(1\)。对邻接矩阵生成的所有 \(n\times n\) 的子方阵,套 LGV 引理,求行列式。然后相加。
然后你发现你不能枚举选择哪 \(n\) 个点啊,因此这里我们规定相邻两层的节点数都恰好是 \(n\)。
对于多层的,使用比内柯西公式解决,题目保证第一层和最后一层都是 \(n\) 个点,使得题目可做。
在第一层和最后一层之间加一层,分别构造两个邻接矩阵 \(A,B\),表示第一层和中间层,最后一层和中间层的连边关系。
思考 \(|AB|\) 的含义。等于所有在 \(A\) 中选择 \(n\) 列(中间层选择 \(n\) 个点),在 \(B\) 中选择对应的 \(n\) 行(中间层选择对应的 \(n\) 个点)。两个方阵的行列式相乘,就是一个卷积形式,就是每种方案的贡献相乘,发现是对的。(过几天我将会看不懂我在说什么)
然后由于矩阵乘法满足结合律,因此所有邻接矩阵连乘,的行列式,就是答案!
时间复杂度 \(O(n^4)\)。常数小吧。
code
#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace pragmatic {
constexpr int N=205,mod=998244353;
int add(int a,int b) { return a+b>=mod ? a+b-mod : a+b; }
void _add(int &a,int b) { a=add(a,b); }
int mul(int a,int b) { return 1ll*a*b%mod; }
void _mul(int &a,int b) { a=mul(a,b); }
int t,k;
int n,m[N];
int u,v;
struct juzhen {
int n,m;
int x[N][N];
void clear() { memset(x,0,sizeof(x)); }
juzhen operator * (const juzhen b) const {
juzhen c={n,b.m};
c.clear();
rep(i,1,c.n) rep(j,1,c.m) {
rep(k,1,m) _add(c.x[i][j],mul(x[i][k],b.x[k][j]));
}
return c;
}
}a[N];
int f;
int ksm(int a,int b=mod-2) {
int s=1;
while(b) {
if(b&1) _mul(s,a);
_mul(a,a);
b>>=1;
}
return s;
}
void _swap(juzhen &a,int x,int y) {
f^=1;
rep(i,1,a.n) swap(a.x[x][i],a.x[y][i]);
}
void gauss(juzhen &a) {
rep(i,1,a.n) {
if(!a.x[i][i])
rep(j,i+1,a.n) {
if(a.x[j][i]) {
_swap(a,i,j);
break;
}
}
int inv=ksm(a.x[i][i]);
rep(j,i+1,a.n) {
if(!a.x[j][i]) continue;
int t=mul(inv,a.x[j][i]);
rep(k,i,a.n) _add(a.x[j][k],mod-mul(t,a.x[i][k]));
}
}
}
int det(juzhen &a) {
f=0;
gauss(a);
int ans=1;
rep(i,1,a.n) {
_mul(ans,a.x[i][i]);
}
if(f) return add(mod,-ans);
return ans;
}
void main() {
sf("%d",&t);
while(t--) {
sf("%d",&k);
rep(i,1,k) sf("%d",&n), a[i].n=n;
rep(i,1,k-1) a[i].m=a[i+1].n;
rep(i,1,k-1) sf("%d",&m[i]);
rep(i,1,k-1) a[i].clear();
rep(i,1,k-1) {
rep(j,1,m[i]) {
sf("%d%d",&u,&v);
a[i].x[u][v]=1;
}
}
rep(i,2,k-1) a[1]=a[1]*a[i];
pf("%d\n",det(a[1]));
}
}
}
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("my.out","w",stdout);
#endif
pragmatic :: main();
}
P7736 [NOI2021] 路径交点的更多相关文章
- P7736-[NOI2021]路径交点【LGV引理】
正题 题目链接:https://www.luogu.com.cn/problem/P7736 题目大意 有\(k\)层的图,第\(i\)层有\(n_i\)个点,每层的点从上到下排列,层从左到右排列.再 ...
- [luogu7736]路径交点
对于两条路径,注意到每一个交点都会改变两者的上下关系,因此两条路径交点的奇偶性,仅取决于两者的起点和终点是否改变了上下关系(改变即为奇数) 类似地,对于整个路径方案,令$p_{i}$为以第一层的$i$ ...
- LGV 引理小记
讲个笑话,NOI 之前某场模拟赛让我知道了这个神奇的科技,于是准备 NOI 之前学完,结果鸽着鸽着就鸽掉了,考 day1 之前一天本来准备花一天时间学的,然后我就开玩笑般地跟自己说,这么 trivia ...
- LGV 引理
(其实是贺的:https://www.luogu.com.cn/paste/whl2joo4) 目录 LGV 引理 不相交路径计数 例题 Luogu6657. [模板]LGV 引理 CF348D Tu ...
- LGV 引理——二维DAG上 n 点对不相交路径方案数
文章目录 引入 简介 定义 引理 证明 例题 释疑 扩展 引入 有这样一个问题: 甲和乙在一张网格图上,初始位置 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_ ...
- canvas判断点是否在路径内
应用场景 我们的项目中有个功能是,canvas上的某个图片选中后可以再这个图片上用鼠标拖拽绘制画笔线条. 当然绘制的边界要控制在图片大小范围内的,那么鼠标是可以随意动的,怎么能控制只在图片上的时候才绘 ...
- 2021NOI同步赛
\(NOI\) 网上同步赛 明白了身为菜鸡的自己和普通人的差距 DAY1 \(T1\) 轻重边 [题目描述] 小 W 有一棵 \(n\) 个结点的树,树上的每一条边可能是轻边或者重边.接下来你需要对树 ...
- CodeForces 590C Three States BFS
Three Statesy 题解: 以3个大陆为起点,都dfs一遍,求出该大陆到其他点的最小距离是多少, 然后枚举每个点作为3个大陆的路径交点. 代码: #include<bits/stdc++ ...
- codeforces 8D Two Friends 二分+ 判断三个圆是否有公共交点
题目链接 有两个人x, y, 现在在A点, x要直接去B点, y要先去C点在去B点, 现在给出x, y两人可以行走的最大距离T1, T2, 求出他们从A点出发之后, 可以走的最长的公共路径. 我们先看 ...
- 全局光照:光线追踪、路径追踪与GI技术进化编年史
全局光照(Global Illumination,简称 GI), 作为图形学中比较酷的概念之一,是指既考虑场景中来自光源的直接光照,又考虑经过场景中其他物体反射后的间接光照的一种渲染技术. 大家常听到 ...
随机推荐
- shell 一下子创建多个 文件 和文件夹
#!bin/bash seq -f "led%01g" 0 35| xargs mkdir for((i = 0;i<36;i++)) do led="led&qu ...
- qt 错误 多继承 造成错误 “qt_metacast”: 不是“****”的成员
简介 多继承造成"qt_metacast": 不是"****"的成员错误的解决方案. 原格式 class BezierSurface : public Stra ...
- robots.txt 简单解析
简介 robots.txt 是一个规范,对于执行正常操作的爬虫理应遵守的规范. 例子 博客园例子 https://www.cnblogs.com/robots.txt User-Agent: * Al ...
- SciTech-Mathmatics - Advanced Linear Algebra(高等线性代数): Vector、Vectors、Vector Space 和 Matrix 的奇妙联系
SciTech-Mathmatics - Advanced Linear Algebra(高等线性代数): Vector.Vectors.Vector Space和 Matrix 的奇妙联系 \(\l ...
- Win11专业版电脑开机音效如何设置的问题
不少电脑基地的小伙伴都下载安装了win11专业版这款系统,也有不少细心的小伙伴发现了win11电脑开机音效变了,但是新的音效听起来非常的不舒服,怎么设置其他声音呢?下面技术员小编就来分享具体的解决方法 ...
- CVE-2020-11981 Apache Airflow Celery 消息中间件命令执行漏洞 (复现)
CVE-2020-11981目录终端下执行docker compose run airflow-init初始化Airflow 所需的数据库 再执行docker compose up -d启动容器(这个 ...
- Gateway 聚合swagger文档
在微服务架构下,通常每个微服务 都会使用 Swagger 来管理我们的接口文档,当微服务越来越多,接口查找管理无形中要浪费我们不少时间,因此,我们需要把其它系统的 Swagger 文档聚合到 Ga ...
- [题解]P2015 二叉苹果树
P2015 二叉苹果树 树形dp,一般用dfs辅助解决. 当我们搜索到\(u\),此时剩下\(cnt\)条边可以用,也就是说\(u\)为根节点的子树最多可以保留\(cnt\)条边. 由于上一层的需求, ...
- 2025年顶级AI模型html游戏设计大比拼,到底谁才是编码王者?
面对这样一道问题,我选择了gpt-5-thinking.gemini-2.5-pro.grok4.claude sonnet 4.deepseek-v3.1-思考模式.kimi-k2.Qwen3-23 ...
- Qt 软件调试——windbg初篇(一)
https://blog.csdn.net/weixin_39568531/article/details/134787829 在上一篇<Qt 软件调试(二)使用dump捕获崩溃信息>中我 ...