【学习笔记】[PA2021] Fiolki 2
Part 1
前置知识:LGV引理
摘抄自oi-wiki:
L G V LGV LGV引理可以用来处理有向无环图上不相交路径计数等问题。
基本定义: w ( P ) w(P) w(P)表示 P P P这条路径上所有边的 边权之积 。(路径计数时,可以将边权都设为 1 1 1)
e ( u , v ) e(u,v) e(u,v)表示 u u u到 v v v的每一条路径 P P P的 w ( P ) w(P) w(P)之和,即 e ( u , v ) = ∑ P : u → v w ( P ) e(u,v)=\sum_{P:u\to v}w(P) e(u,v)=∑P:u→vw(P)。(注意这里的 P P P都是简单路径)
设起点集合为 A A A,终点集合为 B B B,大小均为 n n n。
一组 A → B A\to B A→B的不相交路径 S S S: S i S_i Si时一条从 A i A_i Ai到 B σ ( S ) i B_{\sigma(S)_i} Bσ(S)i的路径(其中 σ ( S ) \sigma(S) σ(S)是一个排列),对于任意 i ≠ j i\ne j i=j, S i S_i Si和 S j S_j Sj没有公共结点。记 t ( σ ) t(\sigma) t(σ)表示排列 σ \sigma σ的逆序对个数。
引理:
M = [ e ( A 1 , B 1 ) e ( A 1 , B 2 ) ⋯ e ( A 1 , B n ) e ( A 2 , B 1 ) e ( A 2 , B 2 ) ⋯ e ( A 2 , B n ) ⋮ ⋮ ⋱ ⋮ e ( A n , B 1 ) e ( A n , B 2 ) ⋯ e ( A n , B n ) ] M=\begin{bmatrix} 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{bmatrix} 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)
det(M) = ∑ S : A → B ( − 1 ) t ( σ ( S ) ) ∏ i = 1 n ω ( S i ) \text{det(M)}=\sum_{S:A\to B}(-1)^{t(\sigma(S))}\prod_{i=1}^n\omega(S_i) det(M)=S:A→B∑(−1)t(σ(S))i=1∏nω(Si)
其中 ∑ S : A → B \sum_{S:A\to B} ∑S:A→B表示 A → B A\to B A→B的不相交路径组 S S S。
证明考虑行列式的定义,对于相交的路径组可以两两配对且符号相反,因此可以抵消。
对于这道题,题目保证了是有向无环图,因此考虑 L G V LGV LGV引理。
显然,将每条边随机赋一个权值后,就可以直接通过行列式非零来判断是否存在不相交路径。
对于区间 [ l , r ] [l,r] [l,r],由于并不确定被选出的 i i i个位置,因此考虑对于每个位置构造一个 k k k维向量,答案即为从 [ l , r ] [l,r] [l,r]中选出的极大线性无关向量组的大小。路径权值之和可以通过拓扑排序求出。
这样,我们从左往右扫描线,维护一个线性基,如果线性相关了就把编号最小的基替换掉,将剩下的基的编号排序从小到大排序后就能知道每个区间对应的基的大小。
复杂度 O ( n k 2 + m k ) O(nk^2+mk) O(nk2+mk)。
注意线性基的实现方式。
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define fi first
#define se second
#define db double
#define inf 0x3f3f3f3f
using namespace std;
const int mod=1e9+7;
const int N=1e5+5;
int n,m,K,du[N],vs[N];
ll a[N][55];
mt19937 gen(114514);
vector<pair<int,int>>G[N];
queue<int>Q;
void add(ll &x,ll y){x=(x+y)%mod;
}
ll f[55][55];
int id[55];
ll res[55];
ll fpow(ll x,ll y=mod-2){ll z(1);for(;y;y>>=1){if(y&1)z=z*x%mod;x=x*x%mod;}return z;
}
ll g[65];
void ins(int x){for(int i=1;i<=K;i++)g[i]=a[x][i];for(int i=1;i<=K;i++){if(g[i]){if(f[i][i]==0){for(int j=i;j<=K;j++)f[i][j]=g[j];id[i]=x;return;}if(x>id[i]){swap(x,id[i]);for(int j=i;j<=K;j++)swap(f[i][j],g[j]);}ll tmp=g[i]*fpow(f[i][i])%mod;for(int j=i;j<=K;j++)g[j]=(g[j]-f[i][j]*tmp)%mod;}}
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m>>K;for(int i=1;i<=m;i++){int x,y,z;cin>>x>>y,z=gen()%mod;G[x].pb({y,z}),du[y]++;}for(int i=1;i<=K;i++){a[i][i]=1;}for(int i=1;i<=n;i++){if(!du[i])Q.push(i);}while(Q.size()){int u=Q.front();Q.pop();vs[u]=1;for(auto e:G[u]){int v=e.fi,w=e.se;for(int i=1;i<=K;i++)add(a[v][i],a[u][i]*w);if(--du[v]==0)Q.push(v);}}for(int i=K+1;i<=n;i++){if(vs[i])ins(i);vector<int>vec;for(int j=1;j<=K;j++)if(id[j])vec.pb(id[j]);sort(vec.begin(),vec.end());int l=K,sz=vec.size();for(int j=0;j<sz;j++){res[sz-j]+=vec[j]-l;l=vec[j];}res[0]+=i-l;}for(int i=0;i<=K;i++)cout<<res[i]<<"\n";
}
相关文章:
【学习笔记】[PA2021] Fiolki 2
Part 1 前置知识:LGV引理 摘抄自oi-wiki: L G V LGV LGV引理可以用来处理有向无环图上不相交路径计数等问题。 基本定义: w ( P ) w(P) w(P)表示 P P P这条路径上所有边的 边权之积 。(路径计数时,可以将边权都设为…...
计算1到100的和
一、不好的写法 public static void main(String[] args) {int sum 0;int n 100;for (int i 1; i < n; i) {sum i;}System.out.println("sum" sum);}1.定义两个整型变量; 2.执行100次加法运算; 3.打印结果到控制台; 二、好…...
C++下OpenMP耗时统计
在C中,如果你使用OpenMP进行并行计算,你可以使用omp_get_wtime()函数来测量代码段的执行时间。这个函数返回一个double类型的值,表示从某一固定点到当前时间的秒数。因此,你可以在代码的开始和结束点分别调用这个函数,…...

PTA 函数题(C语言)-- 阶乘计算升级版
题目title: 阶乘计算升级版 题目作者: 陈越 浙江大学 本题要求实现一个打印非负整数阶乘的函数。 函数接口定义: void Print_Factorial ( const int N ); 其中N是用户传入的参数,其值不超过1000。如果N是非负整数&#…...

内网穿透入门
内网穿透 内网穿透(英文:Port Forwarding)是一种网络技术,用于将公共互联网(外网)的请求转发到私有局域网(内网)中的特定设备或服务。在许多情况下,设备或服务位于一个局…...
Pickle pyhton反序列化
参考文章 Python pickle反序列化浅析 Pickle包含四种方法 pickle.dump(obj, file) 将obj对象进行封存,即序列化,然后写入到file文件中 注:这里的file需要以wb打开(二进制可写模式) pickle.load(file) 将file这个文件进行解封,即反序列化 …...

动静分离技术
一、HAproxy 动静分离 1、概念: HAproxy 动静分离技术是一种用于优化 Web 服务器性能和提高用户体验的策略,它通过将动态内容和静态内容分别路由到不同的后端服务器来实现,减轻服务器负载,提高网站的响应速度。 动态内容包括由…...

STM32单片机智能小车一PWM方式实现小车调速和转向
目录 1. 电机模块开发 2. 让小车动起来 3. 串口控制小车方向 4. 如何进行小车PWM调速 5. PWM方式实现小车转向 1. 电机模块开发 L9110s概述 接通VCC,GND 模块电源指示灯亮, 以下资料来源官方,具体根据实际调试 IA1输入高电平ÿ…...

灰狼优化算法(GWO)python
目录 一、灰狼优化算法的python实现 二、灰狼优化算法与遗传算法的对比分析(python) 2.1 GWO1.py 2.2 GA1.py 2.3 GWO_vs_GA.py 2.4 运行结果 三、基于莱维飞行改进的灰狼优化算法的python实现 一、灰狼优化算法的python实现 import numpy as …...

项目知识点总结-住房图片信息添加-Excel导出
(1)住房信息添加 Controller: RequestMapping("/add")public String add(Home home, Model model) throws IOException{String sqlPath null;//定义文件保存的本地路径String localPath"D:\\AnZhuang\\Java项目\\选题\\Xin-…...

第三届iEnglish全国ETP大赛决赛即将启动
如今,寓教于乐的学习方式越来越受到家长和孩子的欢迎,“玩中学”成为一种既能培养兴趣又有助于孩子成长的学习趋势。 以“玩转英语,用iEnglish”为活动主题的第三届全国ETP大赛即将于本周五(11月3日)迎来总决赛的抽签仪式。据主办方iEnglish智能英语学习解决方案相关负责人称,…...

创造产业链协同优势后,凌雄科技在DaaS行业转动成长飞轮
企业服务领域,一直存在一种共识:做好很难,但一旦服务模式跑通了,得到了市场的认可,要滚起雪球就会事半功倍。 重资产、重运营的DaaS(设备及服务)赛道,是个非常典型的细分领域。在这…...

【protobuf】protobuf自定义数据格式,CMake编译C++文件读写自定义数据
protobuf自定义数据格式,CMake编译文件读写自定义数据 1.protobuf安装2.定义.proto文件3.编写main.cpp4.编写CMAkeLists配置文件5.运行 1.protobuf安装 protobuf库链接 2.定义.proto文件 新建一个Person.proto文件和一个Animal.proto文件,内容如下&…...

解决:http://localhost:8080 不在以下 request 合法域名列表中
在搭建资源服务器时,遇到了微信开发者工具中无法访问本地资源服务器的情况,报错如下: 参考一篇博文的方法,完美解决 【解决】http://localhost:8080 不在以下 request 合法域名列表中_localhost不在以下 request 合法域名列表中-…...

Linux普通用户提权(sudo)
文章目录 Linux普通用户提权(sudo)1、在sudoers文件添加普通用户2、测试 Linux普通用户提权(sudo) 1、在sudoers文件添加普通用户 正常来说,普通用户初始是不具备提权的能力的,比如执行sudo ls会出现报警告…...

链表指定节点的插入
向现有链表中插入结点,根据插入位置的不同,可分为以下 3 种情况: 插入到链表的头部,作为新的链表中第一个存有数据的结点(又称为”首元结点”);插入到链表中某两个结点之间的位置;插…...

解决问题Conda:CondaValueError: Malformed version string ‘~’ : invalid character(s)
解决问题Conda:CondaValueError: Malformed version string ‘~’ : invalid character(s) 背景 今天使用Conda构建项目运行环境的时候报错::CondaValueError: Malformed version string ‘~’ : invalid character(s) ##报错问题 在安装te…...

Sci Immunol丨Tim-3 适配器蛋白 Bat3 是耐受性树突状细胞
今天和大家分享一篇发表于2022年3月的文章,题目为“Tim-3 adapter protein Bat3 acts as an endogenous regulator of tolerogenic dendritic cell function”,发表在《Sci Immunol》杂志上。文章主要研究了Tim-3和其适配蛋白Bat3在调节免疫应答中的作用…...

天软特色因子看板(2023.10 第14期)
该因子看板跟踪天软特色因子A05005(近一月单笔流通金额占比(%),该因子为近一个月单笔流通金额占比因子,用以刻画股票在收盘时,主力资金在总交易金额中所占的比重。 今日为该因子跟踪第14期,跟踪其在SW801160 (申万公用事业) 中的表…...

Photoshop(PS)2021版 安装教程(图文教程超详细)
软件:PS版本:2021语言:简体中文大小:2.26G安装环境:Win11/Win10(1809以上版本)硬件要求:CPU2.0GHz 内存4G(或更高,不支持7代以下CPU)下载通道①百度网盘丨64位…...

Docker容器部署elasticsearch8.*与Kibana8.*版本使用filebeat采集日志
第 1 步:使用 Docker Compose 部署 Elasticsearch 和 Kibana 首先,我们需要创建一个 docker-compose.yml 文件来定义和运行 Elasticsearch 和 Kibana 服务。这种方式可以轻松管理两个容器的配置和网络。 创建 docker-compose.yml 文件 在一个新的文件夹…...

华为手机开机卡在Huawei界面不动怎么办?
遇到华为手机卡在启动界面(如HUAWEI Logo界面)的情况,可依次尝试以下解决方案,按操作复杂度和风险由低到高排序: 🔧 一、强制重启(优先尝试) 1.通用方法 长按 电源键 音量下键…...
并行硬件环境及并行编程
文章目录 A1. (并行编程 基于的)硬件环境 的 基本模型A2. 特定的硬件实现B1. 并行编程基本模型与编程技术✅ 并行编程的一般流程**第一阶段:基于“编程直觉模型”设计程序****第二阶段:程序编译并部署到实际硬件** B2.特定的 硬件环境下的 并行编程 A1. …...
服务器新建用户无法使用conda
服务器新建用户无法使用conda 1.将.bashrc文件复制到新用户家目录下 sudo cp .bashrc /home/newuser/.bashrc2.source命令激活该文件 source ~/.bashrc3.将.condarc文件复制到新用户家目录下 sudo cp .condarc/home/newuser/.condarc...

vscode调试deepspeed的方法之一(无需调整脚本)
现在deepspeed的脚本文件是: # 因为使用 RTX 4000 系列显卡时,不支持通过 P2P 或 IB 实现更快的通信宽带,需要设置以下两个环境变量 # 禁用 NCCL 的 P2P 通信,以避免可能出现的兼容性问题 export NCCL_P2P_DISABLE"1" …...
虚实共生时代的情感重构:AI 恋爱陪伴的崛起、困局与明日图景
一、虚拟恋人:从技术幻想到情感刚需的跨越 在 5G 网络编织的数字浪潮里,AI 驱动的虚拟恋人正打破次元界限。深度学习算法剖析 3000 万段真实对话语料库,搭配 VR 设备带来的多维度交互体验,如今的虚拟对象已能精准模拟瞳孔微表情&…...
白银6月想法
一、市场回顾 2025年5月,SHFE白银主力合约总体呈现出震荡偏强的运行格局。从2025年5月1日至2025年5月30日,白银期货价格整体运行在7944元至8342元区间内,最高价出现在5月22日的8342.0元,最低价则为5月15日的7944元。最终在5月30日…...

Deepseek基座:Deepseek-v2核心内容解析
DeepSeek原创文章1 DeepSeek-v3:基于MLA的高效kv缓存压缩与位置编码优化技术 2 Deepseek基座:DeepSeek LLM核心内容解析 3 Deepseek基座:Deepseek MOE核心内容解析 4 Deepseek基座:Deepseek-v2核心内容解析 5Deepseek基座…...

Xilinx FPGA 重构Multiboot ICAPE2和ICAPE3使用
一、FPGA Multiboot 本文主要介绍基于IPROG命令的FPGA多版本重构,用ICAP原语实现在线多版本切换。需要了解MultiBoot Fallback点击链接。 如下图所示,ICAP原语可实现flash中n1各版本的动态切换,在工作过程中,可以通过IPROG命令切…...
Android 视图系统入门指南
1. View:界面的最小单位 本质:屏幕上的一个矩形区域,能显示内容或接收触摸。比喻:就像乐高积木,是组成界面的最小单位。常见子类: TextView(文字积木)、Button(按钮积木…...