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] 路径交点的更多相关文章

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

    正题 题目链接:https://www.luogu.com.cn/problem/P7736 题目大意 有\(k\)层的图,第\(i\)层有\(n_i\)个点,每层的点从上到下排列,层从左到右排列.再 ...

  2. [luogu7736]路径交点

    对于两条路径,注意到每一个交点都会改变两者的上下关系,因此两条路径交点的奇偶性,仅取决于两者的起点和终点是否改变了上下关系(改变即为奇数) 类似地,对于整个路径方案,令$p_{i}$为以第一层的$i$ ...

  3. LGV 引理小记

    讲个笑话,NOI 之前某场模拟赛让我知道了这个神奇的科技,于是准备 NOI 之前学完,结果鸽着鸽着就鸽掉了,考 day1 之前一天本来准备花一天时间学的,然后我就开玩笑般地跟自己说,这么 trivia ...

  4. LGV 引理

    (其实是贺的:https://www.luogu.com.cn/paste/whl2joo4) 目录 LGV 引理 不相交路径计数 例题 Luogu6657. [模板]LGV 引理 CF348D Tu ...

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

    文章目录 引入 简介 定义 引理 证明 例题 释疑 扩展 引入 有这样一个问题: 甲和乙在一张网格图上,初始位置 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_ ...

  6. canvas判断点是否在路径内

    应用场景 我们的项目中有个功能是,canvas上的某个图片选中后可以再这个图片上用鼠标拖拽绘制画笔线条. 当然绘制的边界要控制在图片大小范围内的,那么鼠标是可以随意动的,怎么能控制只在图片上的时候才绘 ...

  7. 2021NOI同步赛

    \(NOI\) 网上同步赛 明白了身为菜鸡的自己和普通人的差距 DAY1 \(T1\) 轻重边 [题目描述] 小 W 有一棵 \(n\) 个结点的树,树上的每一条边可能是轻边或者重边.接下来你需要对树 ...

  8. CodeForces 590C Three States BFS

    Three Statesy 题解: 以3个大陆为起点,都dfs一遍,求出该大陆到其他点的最小距离是多少, 然后枚举每个点作为3个大陆的路径交点. 代码: #include<bits/stdc++ ...

  9. codeforces 8D Two Friends 二分+ 判断三个圆是否有公共交点

    题目链接 有两个人x, y, 现在在A点, x要直接去B点, y要先去C点在去B点, 现在给出x, y两人可以行走的最大距离T1, T2, 求出他们从A点出发之后, 可以走的最长的公共路径. 我们先看 ...

  10. 全局光照:光线追踪、路径追踪与GI技术进化编年史

    全局光照(Global Illumination,简称 GI), 作为图形学中比较酷的概念之一,是指既考虑场景中来自光源的直接光照,又考虑经过场景中其他物体反射后的间接光照的一种渲染技术. 大家常听到 ...

随机推荐

  1. shell 一下子创建多个 文件 和文件夹

    #!bin/bash seq -f "led%01g" 0 35| xargs mkdir for((i = 0;i<36;i++)) do led="led&qu ...

  2. qt 错误 多继承 造成错误 “qt_metacast”: 不是“****”的成员

    简介 多继承造成"qt_metacast": 不是"****"的成员错误的解决方案. 原格式 class BezierSurface : public Stra ...

  3. robots.txt 简单解析

    简介 robots.txt 是一个规范,对于执行正常操作的爬虫理应遵守的规范. 例子 博客园例子 https://www.cnblogs.com/robots.txt User-Agent: * Al ...

  4. SciTech-Mathmatics - Advanced Linear Algebra(高等线性代数): Vector、Vectors、Vector Space 和 Matrix 的奇妙联系

    SciTech-Mathmatics - Advanced Linear Algebra(高等线性代数): Vector.Vectors.Vector Space和 Matrix 的奇妙联系 \(\l ...

  5. Win11专业版电脑开机音效如何设置的问题

    不少电脑基地的小伙伴都下载安装了win11专业版这款系统,也有不少细心的小伙伴发现了win11电脑开机音效变了,但是新的音效听起来非常的不舒服,怎么设置其他声音呢?下面技术员小编就来分享具体的解决方法 ...

  6. CVE-2020-11981 Apache Airflow Celery 消息中间件命令执行漏洞 (复现)

    CVE-2020-11981目录终端下执行docker compose run airflow-init初始化Airflow 所需的数据库 再执行docker compose up -d启动容器(这个 ...

  7. Gateway 聚合swagger文档

    ‍ 在微服务架构下,通常每个微服务 都会使用 Swagger 来管理我们的接口文档,当微服务越来越多,接口查找管理无形中要浪费我们不少时间,因此,我们需要把其它系统的 Swagger 文档聚合到 Ga ...

  8. [题解]P2015 二叉苹果树

    P2015 二叉苹果树 树形dp,一般用dfs辅助解决. 当我们搜索到\(u\),此时剩下\(cnt\)条边可以用,也就是说\(u\)为根节点的子树最多可以保留\(cnt\)条边. 由于上一层的需求, ...

  9. 2025年顶级AI模型html游戏设计大比拼,到底谁才是编码王者?

    面对这样一道问题,我选择了gpt-5-thinking.gemini-2.5-pro.grok4.claude sonnet 4.deepseek-v3.1-思考模式.kimi-k2.Qwen3-23 ...

  10. Qt 软件调试——windbg初篇(一)

    https://blog.csdn.net/weixin_39568531/article/details/134787829 在上一篇<Qt 软件调试(二)使用dump捕获崩溃信息>中我 ...