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

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 LOCALfreopen("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.mzph.cn/news/877922.shtml

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

相关文章

ArcGIS如何将投影坐标系转回为地理坐标系

有时候两个数据&#xff0c;一个为投影坐标系&#xff0c;另一个为地理坐标系时&#xff0c;在GIS软件中位置无法叠加到一起&#xff0c;这需要将两个或多个数据的坐标系统一&#xff0c;可以直接将地理坐标系的数据进行投影&#xff0c;或将投影坐标系转为地理坐标系。下面介绍…

自养号测评技术:如何挑选适合的IP环境方案

市面上的IP服务及常见问题 当前市场上常见的IP服务包括911、Luminati、Google Fi、TM流量卡、Socks专线等。这些服务在为用户提供网络代理或VPN服务时&#xff0c;常会遇到以下主要问题&#xff1a; 1. 高负载与重复率高&#xff1a;由于使用人数众多&#xff0c;导致网络拥堵…

【jvm】栈是否存在垃圾回收

目录 一、栈的特点1.1 栈内存分配1.2 栈的生命周期1.3 垃圾回收不直接涉及 二、堆与栈的区别三、总结 一、栈的特点 1.1 栈内存分配 1.栈内存分配是自动的&#xff0c;不需要程序员手动分配和释放。 2.每当一个方法被调用时&#xff0c;JVM就会在这个线程的栈上创建一个新的栈…

移动端爬虫学习记录

免责声明 本文旨在探讨移动端爬虫技术的应用和挑战&#xff0c;仅供教育和研究用途。请确保在合法合规的框架内使用爬虫技术&#xff0c;遵循相关法律法规和网站的使用条款。作者不对因使用本文内容而产生的任何法律或安全问题承担责任。 1、初识移动端爬虫 学习移动端爬虫的原…

docker映射了端口,宿主机不生效

1、问题产生原因 docker run -d --name my-redis -p 6379:6379 -v /usr/redis.conf:/usr/local/etc/redis/redis.conf team-redis:3.2 redis-server /usr/local/etc/redis/redis.conf 这容器跑起来了&#xff0c;端口6379没用。搞的我一直怀疑哪里出错了&#xff0c;查看配置…

继承与构造函数与析构函数

一 #include<iostream> using namespace std; class father { public:father(){cout << "father无参构造函数" << endl;}father(int x):fa(x){cout << "father单参构造函数" << endl;}~father() {cout << "fath…

【docker compose 部署和 go 热部署工具fresh】

文章目录 docker-compose.yml 文件配置得很全面&#xff0c;以下是一些注释安装 fresh配置 fresh注意事项 docker-compose.yml 文件配置得很全面&#xff0c;以下是一些注释 version: 3 services:# MySQL 服务geekai-mysql:image: registry.cn-shenzhen.aliyuncs.com/geekmast…

计算机视觉(CV)技术的优势和挑战。

计算机视觉&#xff08;CV&#xff09;技术在许多领域中具有广泛的应用&#xff0c;并且具有一些优势和挑战。 优势&#xff1a; 1. 高效性&#xff1a;CV技术能够快速处理大量的图像和视频数据&#xff0c;以实现实时的分析和决策。 2. 自动化&#xff1a;CV技术可以自动化地…

CSS的table显示值:布局艺术的幕后推手

CSS的table显示值&#xff1a;布局艺术的幕后推手 摘要 CSS&#xff08;层叠样式表&#xff09;是构建网页布局的核心技术之一。display: table;是CSS中一个强大的属性&#xff0c;它允许元素表现得像HTML表格一样。本文将深入探讨table显示值如何影响元素的布局&#xff0c;…

C++ QT 单例模式

在 C 中&#xff0c;使用 Qt 框架实现单例模式可以确保一个类只有一个实例&#xff0c;并提供一个全局访问点。以下是一个简单的 C Qt 单例模式实现示例。 1. 饿汉式单例模式 饿汉式单例模式在类加载时就初始化单例对象。 // MySingleton.h #ifndef MYSINGLETON_H #define M…

Kakfa的核心概念-Replica副本(kafka创建topic并指定分区和副本的两种方式)

Kakfa的核心概念-Replica副本&#xff08;kafka创建topic并指定分区和副本的两种方式&#xff09; 1、kafka命令行脚本创建topic并指定分区和副本2、springboot集成kafka创建topic并指定分区和副本2.1、springboot集成kafka2.1.1、springboot集成kafka创建topic并指定5个分区和…

VScode 连接远程服务器

1、 2、 3、免密登录 1、本地生成密钥 ssh-keygen2、生成的密钥默认在 C:\Users\***\.ssh\ 中3、将私钥 C:\Users\***\.ssh\id_rsa 添加到上面的配置文件中的 IdentityFile 项内4、将公钥 C:\Users\***\.ssh\id_rsa\id_rsa.pub 拷贝到远程 ~/.ssh/authorized_keys 中 4、远程…

【精选】基于django柚子校园影院(咨询+解答+辅导)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Golang | Leetcode Golang题解之第371题两整数之和

题目&#xff1a; 题解&#xff1a; func getSum(a, b int) int {for b ! 0 {carry : uint(a&b) << 1a ^ bb int(carry)}return a }

python | Python集成学习和随机森林算法

本文来源公众号“python”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Python集成学习和随机森林算法 集成学习是一种通过组合多个模型来提高预测性能的机器学习方法。它通过将多个弱学习器的结果结合起来&#xff0c;形成一个…

音频信号编解码原理及在视频制作中的应用

目录 音频编码与解码概述 常见的音频编码格式 无损与有损编解码器的区别 视频制作中音频编解码器的选择 音频编解码器对延迟和实时传输的影响 结论 音频编码与解码概述 音频编码是指将原始音频数据转换成一种更高效、更紧凑的格式的过程&#xff0c;目的是为了减少存储空…

【算法学习笔记】29:动态规划中可丢弃状态的维度压缩

1 动机 当状态 i i i只依赖于前置状态 i − 1 i - 1 i−1&#xff0c;并且在计算出状态 i i i之后就可以丢弃状态 i − 1 i - 1 i−1时的解时&#xff0c; i − 1 i - 1 i−1就成为一个可丢弃的状态&#xff0c;因此就可以将 i i i这个维度直接压缩&#xff08;省略&#xff0…

「Python数据分析」Pandas进阶,利用concat()函数连接数据(一)

在我们迈向中高级出局数据分析的过程中&#xff0c;数据的合并和连接&#xff0c;是一个非常重要的技能。 现实中&#xff0c;分散在各种数据库&#xff0c;各种数据表格&#xff0c;各种数据存储设备当中的&#xff0c;各式各样的数据&#xff0c;是我们进行数据分析的基础&a…

SmartGit-Git版本控制系统的图形化客户端

SmartGit&#xff1a; SmartGit是一款免费的、专业的Git版本控制系统的图形化客户端。它适用于Windows、Mac和Linux等多种操作系统&#xff0c;提供了直观的用户界面和丰富的功能。支持创建、克隆、推送、拉取、合并和管理Git仓库&#xff0c;以及强大的分支管理功能。还提供了…

(免费领源码)python#Django#msyql学生个性化培养的教学资源平台的设计与实现19385-计算机毕业设计项目选题推荐

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对学生个性化培养的教学资源平台等问题&#…