8.20T3 无损加密(线性代数转LGV+状压dp+高维前缀和)

news2024/11/25 4:45:26

http://cplusoj.com/d/senior/p/NODSX2301C

对于式子:

在这里插入图片描述

这个神秘的线性代数形式比较难处理,但我们可以考虑其组合意义。行列式现存的可用组合意义之一就是LGV(矩阵式不太可用)

先把原先的矩阵转化为一个有向图。现在我们要构造一个图,满足 B i , j B_{i,j} Bi,j 代表从 a i a_i ai 走到 b j b_j bj 所有路径权值积的和为 B i , j B_{i,j} Bi,j,而上面行列式求的就是从 a 1 → n a_{1\to n} a1n 走到 b b b 的任意 ( m n ) \binom m n (nm) 个点的不想交路劲数。

现在我们已经理清条件,考虑构造图了。我们先弄一行 a a a b b b

在这里插入图片描述

现在是满足条件的。

我们考虑在 [ l , r ] [l,r] [l,r] 内加入 d , c d,c d,c,不妨令其为 [ 2 , 3 ] [2,3] [2,3],在外面加没问题:

在这里插入图片描述

而对于 [l,r] 内的情况,我们相当于在原先基础上多了一个不断往右增 c c c 的边:

在这里插入图片描述

这样子建边能完美解决我们的问题。

现在只需要对最终的图统计不相交路径数即可。

我们考虑第 i i i 列的链:

在这里插入图片描述

根据题目,这条链的总入度和总出度不超过 s s s,其实我们状压一下。

我们可以先钦定哪些入度有流,从上一步的 f [ S ] f[S] f[S] 转移过来,当然必须满足红色点也有流。

然后我们直接让这些流先走到最近的出度。

当走到最近的出度后,他们还可以往下走,此时我们可以拿一个类似高维前缀和的东西来实现。而这里,我们要按顺序,先走最上面,再往下一个一个考虑,那样子才能保证路径不交。

我们可以设 g ( s , i ) g(s,i) g(s,i) 表示当前状态是 s s s,考虑到第 i i i 个1的路径权值积之和、

最后我们把黄色点的东西去掉,就可以转移到新 f [ T ] f[T] f[T]

答案为 f [ 0 ] f[0] f[0]

复杂度我实现有点劣,为 O ( n 2 s s 2 ) O(n2^s s^2) O(n2ss2),但很多情况会直接停止,所以跑不满。

4k

#include<bits/stdc++.h>
using namespace std;
#ifdef LOCAL
 #define debug(...) fprintf(stdout, ##__VA_ARGS__)
 #define debag(...) fprintf(stderr, ##__VA_ARGS__)
#else
 #define debug(...) void(0)
 #define debag(...) void(0)
#endif
#define int long long
inline int read(){int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;
ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+
(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
#define fi first
#define se second
#define M 9
#define mo (int)(1e9 + 7)
#define N 200010
int pw(int a, int b) {
	int ans = 1; 
	while(b) {
		if(b & 1) ans *= a; 
		a *= a; b >>= 1; 
		ans %= mo; a %= mo; 
	}
	return ans; 
}
int pw(int a) { return pw(a, mo - 2); }
inline void Mod(int &a) { if(a >= mo || a <= -mo) a %= mo; if(a < 0) a += mo; }
inline void Add(int &a, int b) { a += b; Mod(a); }
inline void Mul(int &a, int b) { Mod(b); a *= b; Mod(a); } 
int n, m, i, j, k, T;
int C[N * M], D[N * M], q, l, r, Ds[N * M]; 
vector<int>L[N], R[N]; 
int nl, nr, s, t, f[1 << 10], g[1 << 10][11], nxt[15]; 
int ans, c[15], d[15], del[15]; 

signed main()
{
	#ifdef LOCAL
	  freopen("in.txt", "r", stdin);
	  freopen("out.txt", "w", stdout);
	#endif
//	srand(time(NULL));
//	T=read();
//	while(T--) {
//
//	}
	n = read(); m = read(); q = read(); Ds[0] = C[q + 1] = 1; 
	for(T = 1; T <= q; ++T) {
		l = read(); r = read(); C[T] = read(); D[T] = read(); 
		Ds[T] = D[T] * Ds[T - 1] % mo; 
		for(j = l + 1; j <= r; ++j) L[j].pb(T); 
		for(j = l; j < r; ++j) R[j].pb(T); 
	}
	Ds[q + 1] = Ds[q]; 
	debug("Ds : "); for(i = 0; i <= q + 1; ++i) debug("%lld ", Ds[i]); debug("\n"); 
	f[0] = 1; 
	for(T = 1; T <= m; ++T) {
		nl = L[T].size(); j = 0; 
		R[T].pb(q + 1); nr = R[T].size(); 
		for(auto t : L[T]) debug("%lld ", t); debug("\n"); 
		for(auto t : R[T]) debug("%lld ", t); debug("\n"); 
		for(auto t : L[T]) {
			for(k = 0; k < nr; ++k) 
				if(R[T][k] >= t) break; 
			nxt[j] = k; del[j] = Ds[R[T][k]] * pw(Ds[t]) % mo; ++j; 
			debug("[%lld %lld]%lld ", t, R[T][k], nxt[j - 1]); 
		}
		debug("\n"); 
		memset(g, 0, sizeof(g)); 
		for(s = 0; s < (1 << nl); ++s) {
			debug("f[%lld] = %lld\n", s, f[s]); 
			t = (T <= n ? 1 : 0); 
			int G = (T <= n ? Ds[R[T][0]] : 1); 
			for(j = 0; j < nl; ++j) {
				if(!(s & (1 << j))) continue; 
				if(t & (1 << nxt[j])) break; 
				t |= (1 << nxt[j]); G = G * del[j] % mo; 
			}
			if(j < nl) continue; 
			debug("--> %lld[%lld %lld] += %lld\n", t, t, 1ll, f[s]); 
//			if(!t) Add(g[t][0], f[s]); 
//			else 
			Add(g[t][1], f[s] * G % mo); 
		}
		for(i = 0; i < nr; ++i) c[i] = C[R[T][i]]; 
		for(i = 0; i < nr - 1; ++i) d[i] = Ds[R[T][i + 1]] * pw(Ds[R[T][i]]) % mo; 
		debug("# C : "); for(i = 0; i < nr; ++i) debug("%lld ", c[i]); debug("\n"); 
		debug("# D : "); for(i = 0; i < nr - 1; ++i) debug("%lld ", d[i]); debug("\n"); 
		for(i = 1; i <= nl + 1; ++i) //第 
			for(s = 0; s < (1 << nr); ++s) {
//				debug("(%lld %lld)\n", s, i); 
				if(!g[s][i]) continue; 
				if(__builtin_popcount(s) < i) continue; 
				for(k = j = 0; k < nr; ++k) {
					if((s >> k) & 1) ++j; 
					if(j == i) break; 
				}
				debug("(%lld %lld)%lld * %lld [%lld] => (%lld %lld)\n", s, i, g[s][i], c[k], k, s, i + 1); 
				Add(g[s][i + 1], g[s][i] * c[k] % mo); 
				if(k + 1 >= nr || ((s >> k + 1) & 1)) continue; 
				t = s - (1 << k) + (1 << k + 1); 
				debug("(%lld %lld)%lld * %lld [%lld] => (%lld %lld)\n", s, i, g[s][i], d[k], k, t, i); 
				Add(g[t][i], g[s][i] * d[k] % mo); 
			}
		memset(f, 0, sizeof(f)); 
		for(s = 0; s < (1 << nr); ++s) {
			t = s & (1 << nr - 1) - 1; 
			int cnt = __builtin_popcount(s); 
			debug(">>> %lld ---> %lld (%lld %lld)[%lld]\n", s, t, s, cnt + 1, g[s][cnt + 1]); 
			Add(f[t], g[s][cnt + 1]); 
		}
		debug("------------\n"); 
	}
	ans = f[0]; 
	printf("%lld", ans); 
//	for(i = 1; i <= m; ++i) assert(L[i].size() <= 8 && R[i].size() <= 8); 
	return 0;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

笔记本电脑无线网卡突然没有了

目录 笔记本电脑无线网卡突然没有了最优解决方案 笔记本电脑无线网卡突然没有了 记录一次笔记本无线网卡突然没有了的解决方案 显示黄色感叹号&#xff0c;试了几个安装驱动的软件都不行 最优解决方案 找到网卡的厂商官网&#xff0c;官网上下载驱动 比如我的无线网卡是Int…

【Hot100】LeetCode—146. LRU 缓存

目录 1-思路1-1 LRU知识点1-2 实现思路LRU的子数据结构① 双向链表 DLinkedNode 结点定义② 其他字段 LRU实现的方法① 初始化——LRUCache中初始化② public int get(int key) 取元素方法③ public void put(int key, int value) 存元素方法 2-实现⭐146. LRU 缓存——题解思路…

rufus制作ubantu的U盘安装介质时,rufus界面上的分区类型选什么?

rufus制作ubantu的U盘安装介质时&#xff0c;rufus软件界面上的分区类型选什么(如下图&#xff09;&#xff1f; 在使用Rufus制作Ubuntu的U盘安装介质时&#xff0c;分区类型的选择取决于我们的计算机的引导方式。 以下是具体的选择建议&#xff1a; 1、查看计算机的引导方式…

JAVA设计模式之【单例模式】

1 类图 2 饿汉式单例 例如&#xff1a;静态块、静态成员 2.1 概念 类加载的时候就立即初始化&#xff0c;并且创建单例对象 2.2 优点 没有加任何的锁、执行效率比较高 2.3 缺点 类加载的时候就初始化&#xff0c;不管用与不用都占着空间&#xff0c;浪费了内存。 3 懒汉…

Java之迭代器的使用

Java之迭代器的使用 摘要基础知识List迭代器Map迭代器 摘要 本博客主要讲解容器的迭代器的使用&#xff0c;包括List、Set和Map等容器 基础知识 这是类的继承关系图 迭代器的原理(一开始迭代器并不指向任何有效元素)&#xff1a; List迭代器 public class TestIterator …

VMware vSphere Client无法访问和连接ESXi虚拟主机解决思路

文章目录 前言1. 问题现象2. 问题原因3. 解决方法4. 参考文章 前言 注意 : 可以先看看参考文章那里&#xff0c;在回过来看 1 、 2 、3 1. 问题现象 版本&#xff1a;VMware vCenter Server 5.5.0 build-2442329 问题描述&#xff1a;用VMware vSphere Client 登录ESXI主机出…

【Linux —— 线程互斥】

Linux —— 线程互斥 1. 临界资源与临界区2. 互斥的定义3. 原子性4. 互斥量(Mutex)5. 互斥的实现示例 1. 临界资源与临界区 临界资源: 指的是多个线程或进程共享的资源&#xff0c;例如全局变量、文件、数据库等。由于这些资源的共享&#xff0c;可能会导致数据不一致或程序崩…

git commit 时发生:fatal: cannot lock HEAD ref

.git目录探析_.git文件在哪-CSDN博客https://blog.csdn.net/luofeng457/article/details/117577275 tree .git .git ├── branches ├── COMMIT_EDITMSG ├── config ├── description ├── FETCH_HEAD ├── HEAD ├── hooks │ ├── applypatch-msg.sample…

STM32的GPIO

GPIO基本控制 GPIO(General-Purpose input/output,通用输入/输出接口) 用于感知外部信号&#xff08;输入模式&#xff09;和控制外部设备&#xff08;输出模式&#xff09; 简单模块&#xff1a;LED,按键&#xff0c;蜂鸣器&#xff0c;温度传感器&#xff0c;使用一个GPIO…

qt-PLC可视化编辑器

qt-PLC可视化编辑器 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #include "diagramitem.h" #include "arrow.h"#include <QDebug> #include <QGraphicsScene> #include <QGraphicsSceneContextMenuEvent> #includ…

1 Kubeflow总体介绍-学习笔记

1 什么是 Kubeflow Kubeflow 是一个开源项目社区和生态系统&#xff0c;支持机器学习 (ML) 生命周期中的每个阶段 &#xff0c;并支持相关的开源 工具和框架&#xff0c;Kubeflow 使 Kubernetes 上的 AI/ML 变得简单、可移植且可扩展。 Kubeflow 都能提供模块化、可扩展的工具…

C语言第17篇

1.在C语言中,全局变量的存储类别是_________. A) static B) extern C) void D) register 提示&#xff1a;extern adj.外来的 register n.登记表&#xff0c;v.登记 提示与本题无关 2.在一个C源程序文件中,要定义一个只允许本源文件中所有函数使用的全局变…

JimuReport 积木报表 v1.8.0 版本发布,开源可视化报表

项目介绍 一款免费的数据可视化报表工具&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完…

【Python】成功解决 NameError: name ‘reload‘ is not defined

【Python】成功解决 NameError: name ‘reload’ is not defined 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校…

【学习笔记】7、存储器、复杂可编程器件和现场可编程门阵列

可编程逻辑器件PLD复杂可编程逻辑器件CPLD现场可编程门阵列FPGA 7.1 只读存储器&#xff08;ROM&#xff09; 7.1.1 ROM的结构 ROM存储器 存储阵列 地址译码器 输出控制电路 存储阵列&#xff0c;由许多存储单元&#xff08;1bit&#xff09;组成。每次读出一组数据&…

HTML实现俄罗斯方块

本篇文章主要讲使用HTML、CSS和JavaScript实现一个简单的俄罗斯方块游戏&#xff0c;包含基本的游戏逻辑、行消除功能以及暂停和继续游戏的控制。 使用工具 本篇文章有用到ChatGPT-4o代码纠错&#xff0c;国内免翻且稳定&#xff0c;感兴趣的大佬试试。 传送门&#xff1a;36…

认知杂谈20

今天分享 有人说的一段争议性的话 I I 程序员的高薪舒适圈&#xff1a;光鲜背后的挑战 一说起程序员这个职业&#xff0c;很多人马上就会想到高薪&#xff0c;觉得他们过着白领的生活。确实&#xff0c;程序员一般都能拿到比好多行业都高的工资&#xff0c;工作时间也比较稳…

谷粒商城实战笔记-232-商城业务-认证服务-框架效果演示-xxl-sso-徐雪里

文章目录 一&#xff0c;膜拜大神许雪里二&#xff0c;用开源框架xxl-sso演示单点登录1&#xff0c;我是老板&#xff0c;我有三个网站2&#xff0c;配置域名3&#xff0c;下载xxl-sso代码4&#xff0c;服务规划5&#xff0c;配置修改5.1 xxl-sso-server redis配置修改5.1 xxl-…

使用FModel提取黑神话悟空的资产

使用FModel提取黑神话悟空的资产 前言设置效果展示闲聊可能遇到的问题没有相应的UE引擎版本选项 前言 黑神话悟空昨天上线了&#xff0c;解个包looklook。 本文内容比较简洁&#xff0c;仅介绍解包黑神话所需的专项配置&#xff0c;关于FModel的基础使用流程&#xff0c;请见…

Python3学习(一)

目录 Python版本 标识符 保留字 注释 缩进 多行语句 同一行显示多条语句 import 与 from...import 变量 数据类型 Number&#xff08;数字&#xff09; 数字类型 数值运算 String&#xff08;字符串&#xff09; bool&#xff08;布尔类型) List&#xff08;列…