当前位置: 首页 > article >正文

矩阵 trick 系列 题解

1.AT_dp_r Walk(矩阵+图论)

题意

一个有向图有 n n n 个节点,编号 1 1 1 n n n

给出一个二维数组 A 1... n , 1... n A_{1...n,1...n} A1...n,1...n,若 A i , j = 1 A_{i,j}=1 Ai,j=1 说明节点 i i i 到节点 j j j 有一条有向边;

A i , j = 0 A_{i,j}=0 Ai,j=0 则说明节点 i i i 到节点 j j j 没有边。

求长度为 k k k 的路径的方案数。答案模 1 0 9 + 7 10^9+7 109+7

思路

走动一次路径加 1 1 1,一个点对所有点遍历一遍。

直接对矩阵 A A A 快速 k k k 次幂,求 ∑ d a t a ( A ) \sum data(A) data(A) 就好了。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=111,mod=1e9+7;
ll n,k,ans;
struct matrix
{ll row,col;//行和列ll data[N][N];matrix(ll r,ll c,ll isI){row=r;col=c;memset(data,0,sizeof(data));if(isI){for(int i=1;i<=row;i++)data[i][i]=1;}}
};
matrix operator * (const matrix &a,const matrix &b)
{matrix c(a.row,b.col,0);for(int i=1;i<=a.row;i++)for(int j=1;j<=b.col;j++)for(int k=1;k<=a.col;k++)c.data[i][j]=(c.data[i][j]+a.data[i][k]*b.data[k][j]%mod+mod)%mod;return c;
}
matrix qpow_matrix(matrix a,ll k)
{matrix res(a.row,a.col,1);while(k){if(k&1)res=res*a;a=a*a;k>>=1;}return res;
}
int main()
{scanf("%lld%lld",&n,&k);matrix A(n,n,0);matrix ANS(n,n,0);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%lld",&A.data[i][j]);ANS=qpow_matrix(A,k);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ans=(ans+ANS.data[i][j])%mod;printf("%lld",ans);return 0;
}

2.SMOJ k边最短路/洛谷 P2886 USACO07NOV Cow Relays G

题意

给定一张 m m m 条边的无向连通图,求从 s s s t t t 经过 n n n 条边的最短路长度。

1 ≤ n ≤ 1 0 6 1\le n\le 10^6 1n106 2 ≤ m ≤ 100 2\le m\le 100 2m100 1 ≤ u , v ≤ 1000 1\le u,v\le 1000 1u,v1000 1 ≤ w ≤ 1000 1\le w\le 1000 1w1000

思路

改造一下矩阵运算,变成取和最小值即可(变相floyd)。

用矩阵,自觉离散化了。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=102,inf=0x3f3f3f3f;
map<ll,ll>mp;
ll tot;
struct matrix
{ll row,col;//行和列ll data[N][N];
};
matrix operator * (const matrix &a,const matrix &b)
{matrix c;memset(c.data,inf,sizeof(c.data));for(int i=1;i<=tot;i++)for(int j=1;j<=tot;j++)for(int k=1;k<=tot;k++)c.data[i][j]=min(c.data[i][j],a.data[i][k]+b.data[k][j]);return c;
}
matrix qpow_matrix(matrix a,ll k)
{matrix res;res=a;k--;while(k){if(k&1)res=res*a;a=a*a;k>>=1;}return res;
}
ll n,m,s,t;
int main()
{scanf("%lld%lld%lld%lld",&n,&m,&s,&t);matrix A;memset(A.data,inf,sizeof(A.data));for(int i=1;i<=m;i++){ll w,u,v;scanf("%lld%lld%lld",&w,&u,&v);if(!mp[u])mp[u]=++tot;if(!mp[v])mp[v]=++tot;A.data[mp[u]][mp[v]]=A.data[mp[v]][mp[u]]=w;}A=qpow_matrix(A,n);printf("%lld",A.data[mp[s]][mp[t]]);return 0;
}

3.SMOJ 染色/AT_abc256_g Black and White Stones

题意

有一个正 n n n 多边形,每条边的长度都是 d d d

从第 1 1 1 个端点开始,每隔 1 1 1 个单位距离就放一个小石头,小石头是白色或者黑色。显然,一条边会有 d + 1 d+1 d+1 个小石头。

现在对放石头有一个规定:最后每条边的白色小石头的数量必须相等。问有多少种不同的方案,答案模 998244353 998244353 998244353

思路

考虑朴素的 dp,设 f i , 0 / 1 f_{i,0/1} fi,0/1 表示第 i i i 条边尾巴是白/黑的方案数。枚举一条边上有 j ∈ [ 0 , d + 1 ] j\in[0,d+1] j[0,d+1] 条白色石头,那么有:

  1. 尾巴是白,可以:
    (1) 白+白白,中间 d − 1 d-1 d1 个有 j − 2 j-2 j2 个白乱排。
    (2) 黑+黑白,中间 d − 1 d-1 d1 个有 j − 1 j-1 j1 个白乱排。
    f i , 0 = f i − 1 , 0 ⋅ C d − 1 j − 2 + f i − 1 , 1 ⋅ C d − 1 j − 1 f_{i,0}=f_{i-1,0}\cdot C_{d-1}^{j-2}+f_{i-1,1}\cdot C_{d-1}^{j-1} fi,0=fi1,0Cd1j2+fi1,1Cd1j1

  2. 尾巴是黑,可以:
    (1) 白+白黑,中间 d − 1 d-1 d1 个有 j − 1 j-1 j1 个白乱排。
    (2) 黑+黑黑,中间 d − 1 d-1 d1 个有 j j j 个白乱排。
    f i , 1 = f i − 1 , 0 ⋅ C d − 1 j − 1 + f i − 1 , 0 ⋅ C d − 1 j f_{i,1}=f_{i-1,0}\cdot C_{d-1}^{j-1}+f_{i-1,0}\cdot C_{d-1}^j fi,1=fi1,0Cd1j1+fi1,0Cd1j

这就很矩阵啊!直接矩阵快速幂优化:
[ f i , 0 f i , 1 ] = [ f i − 1 , 0 f i − 1 , 1 ] ⋅ [ C d − 1 j − 2 C d − 1 j − 1 C d − 1 j − 1 C d − 1 j ] \begin{bmatrix} f_{i,0} & f_{i,1} \end{bmatrix}=\begin{bmatrix} f_{i-1,0} & f_{i-1,1} \end{bmatrix}\cdot \begin{bmatrix} C_{d-1}^{j-2} & C_{d-1}^{j-1}\\ C_{d-1}^{j-1} & C_{d-1}^j \end{bmatrix} [fi,0fi,1]=[fi1,0fi1,1][Cd1j2Cd1j1Cd1j1Cd1j]

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=5,M=1e4+9,mod=998244353;
ll n,k,ans;
ll fac[M],inv[M];
inline ll read()
{ll s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w;
}
inline void write(ll x)
{ if(x==0){putchar('0');return;}ll len=0,k1=x,c[10005];if(k1<0)k1=-k1,putchar('-');while(k1)c[len++]=k1%10+'0',k1/=10;while(len--)putchar(c[len]);
}
struct matrix
{ll row,col;//行和列ll data[N][N];matrix(ll r,ll c,ll isI){row=r;col=c;memset(data,0,sizeof(data));if(isI){for(int i=1;i<=row;i++)data[i][i]=1;}}
};
matrix operator * (const matrix &a,const matrix &b)
{matrix c(a.row,b.col,0);for(int i=1;i<=a.row;i++)for(int j=1;j<=b.col;j++)for(int k=1;k<=a.col;k++)c.data[i][j]=(c.data[i][j]+a.data[i][k]*b.data[k][j]%mod+mod)%mod;return c;
}
matrix qpow_matrix(matrix a,ll k)
{matrix res(a.row,a.col,1);while(k){if(k&1)res=res*a;a=a*a;k>>=1;}return res;
}
ll qpow(ll x,ll k)
{ll res=1;while(k){if(k&1)res=res*x%mod;x=x*x%mod;k>>=1;}return res;
}
void init()
{fac[0]=inv[0]=1;for(int i=1;i<=1e4;i++){fac[i]=fac[i-1]*i%mod;inv[i]=qpow(fac[i],mod-2);}
}
ll C(ll n,ll m)
{if(n<0||m<0||n<m)return 0;return fac[n]%mod*inv[m]%mod*inv[n-m]%mod;
}
int main()
{init();n=read(),k=read();for(int i=0;i<=k+1;i++)//每条边枚举白色个数 {matrix ANS(1,2,0);matrix A(2,2,0);A.data[1][2]=1;matrix B(2,2,0);B.data[1][1]=C(k-1,i-2),B.data[1][2]=B.data[2][1]=C(k-1,i-1),B.data[2][2]=C(k-1,i);ANS=A*qpow_matrix(B,n);ans=(ans+ANS.data[1][2])%mod;}write(ans*2%mod);return 0;
}

相关文章:

矩阵 trick 系列 题解

1.AT_dp_r Walk&#xff08;矩阵图论&#xff09; 题意 一个有向图有 n n n 个节点&#xff0c;编号 1 1 1 至 n n n。 给出一个二维数组 A 1... n , 1... n A_{1...n,1...n} A1...n,1...n​&#xff0c;若 A i , j 1 A_{i,j}1 Ai,j​1 说明节点 i i i 到节点 j j j …...

obj离线加载(vue+threejs)+apk方式浏览

demo需求&#xff1a;移动端&#xff0c;实现obj本地离线浏览 结合需求&#xff0c;利用&#xff08;vue2threejs173&#xff09;进行obj的加载&#xff0c;然后采用apk方式&#xff08;hbuilderX打包发布&#xff09;移动端浏览&#xff1b; https://github.com/bianbian886/…...

关于mysql 表中字段存储JSON对象对JSON对象中的bolean字段进行查询的方式

业务场景如题 JSON对象为 表为客诉表中的 发现利用原有的xml中的 and a1.order_list ->‘$[*].isZg’ request.isZg 后续发现需要更改为有效 本文作为自己日常工作记录用&#xff0c;有遇到相同问题的可以作为参考。...

WordPress Course Booking System SQL注入漏洞复现 (CVE-2025-22785)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

Kylin麒麟操作系统 | 系统监控

以下所使用的环境为&#xff1a; 虚拟化软件&#xff1a;VMware Workstation 17 Pro 麒麟系统版本&#xff1a;Kylin-Server-V10-SP3-2403-Release-20240426-x86_64 一、系统状态查询工具 1. 静态显示系统进程信息ps ps命令会生成一个静态列表&#xff0c;列表中显示的进程其…...

vLLM服务设置开机自启动(Linux)

要在开机时进入指定的 conda 环境并启动此 vllm 服务&#xff0c;您可以通过以下步骤设置一个 systemd 服务来自动执行脚本。 一、第一步&#xff1a;创建一个启动脚本 1.打开终端并创建启动脚本&#xff0c;例如 /home/username/start_vllm.sh&#xff08;请替换 username 为…...

MongoDB#Code和Function

背景 在MongoDB Shell中, 使用db.system.js.inertOne 新增一个自定义函数后&#xff0c;读取值类型显示Code Class&#xff0c;该如何使用&#xff1f;Code类型和Function能互相转换吗&#xff1f; 实践 // 保存一个函数到 system.js 集合 db.system.js.insertOne({_id: &qu…...

MT-Metrics

MT-Metrics 是一类用于评估生成文本质量的指标&#xff0c;最初用于机器翻译任务&#xff0c;后来扩展到生成任务&#xff08;如对话生成、文本摘要等&#xff09;。它的核心思想是通过比较生成文本与参考文本之间的相似性&#xff08;如词汇重叠、句法结构、语义相似性&#x…...

几个api

几个api 原型链 可以阅读此文 Function instanceof Object // true Object instanceof Function // true Object.prototype.isPrototypeOf(Function) // true Function.prototype.isPrototypeOf(Object) // true Object.__proto__ Function.prototype // true Function.pro…...

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

数字IC后端时钟树综合专题&#xff08;OCC电路案例分享&#xff09; 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC&#xff1f; 片上时钟控制器(On-chip Clock Controllers &#xff0c;OCC)&#xff0c;也称为扫描时钟控制器(Scan Clock Con…...

SurfaceFlinger代码笔记

drawLayers是做client合成&#xff0c;合成完以后的buffer会放在RenderSurface里 FrameBufferSurface里的buffer是通过setClientTarget给到HWC的&#xff08;HWC应该给client合成的buffer留了一个slot) Output.cpp这个文件非常关键&#xff0c;代表着具体一个Display的操作 d…...

Trae根据原型设计稿生成微信小程序密码输入框的踩坑记录

一、需求描述 最近经常使用Trae生成一些小组件和功能代码&#xff08;对Trae赶兴趣的可以看之前的文章《TraeAi上手体验》&#xff09;&#xff0c;刚好在用uniapp开发微信小程序时需要开发一个输入密码的弹框组件&#xff0c;于是想用Trae来实现。原型设计稿如下&#xff1a;…...

软件测试丨Docker与虚拟机架构对比分析

Docker 与虚拟机&#xff08;VM&#xff09;在架构上有显著区别&#xff0c;主要体现在资源利用、性能、隔离性和启动时间等方面。以下是两者的主要架构区别&#xff1a; 1. 架构层次 Docker: 主机操作系统&#xff1a;Docker 直接运行在宿主机的操作系统上。Docker 引擎&…...

在VsCode中选择conda编译器环境

当vscode出现始终在激活一个已经不存在的虚拟环境&#xff0c;可选择手动将其调换 在 Visual Studio Code (VSCode) 中选择 Python 虚拟环境的步骤如下&#xff1a; 确保安装了 Python 插件&#xff1a;首先&#xff0c;你需要确保已经安装了适用于 VSCode 的 Python 插件。你…...

微信小程序 - 条件渲染(wx:if、hidden)与列表渲染(wx:for)

一、条件渲染概述 条件渲染用于根据特定条件决定是否渲染某部分内容 微信小程序提供了两种方式实现条件渲染&#xff0c;分别是 wx:if、hidden 二、条件渲染 1、wx:if &#xff08;1&#xff09;基本介绍 wx:if 根据 condition 的真假决定是否渲染该组件及其子组件 condit…...

【STL】4.<list>

list 前言list容器一.list初始化二.常用函数三.排序 总结 前言 stl系列主要讲述有关stl的文章&#xff0c;使用STL可以大大提高程序开发的效率和代码的可维护性&#xff0c;且在算法比赛中&#xff0c;STL可以帮助我们更方便地实现各种算法。提高我们的效率。 list容器 要使用…...

华为AP 4050DN-HD的FIT AP模式改为FAT AP,家用FAT基本配置

在某鱼买了两台华为AP 4050DN-HD , AP是二手的 , 在AC上上过线 , 所以就不能开机自选为FIP模式了 我没有AC无线控制器 , 就是买一个自己玩 , AP又是FIT瘦AP模式 ,所以我就想把AP的瘦AP模式改为FAT胖AP模式 1. 准备工作 1.1下载好对应软件&#xff0c;进入到 企业业务网站去下…...

vue 设置生产 开发 测试环境

在 Vue.js 中&#xff0c;可以通过配置不同的环境变量来区分生产、开发和测试环境的请求。一般情况下&#xff0c;我们使用 webpack 或 Vite 进行构建&#xff0c;它们都支持环境变量的配置。 以下是如何在 Vue 项目中配置不同环境的请求&#xff1a; 1. 配置 .env 文件 在项…...

vue3+ts+uniapp+unibest 微信小程序(第二篇)—— 图文详解自定义背景图页面布局、普通页面布局、分页表单页面布局

文章目录 简介一、自定义背景图布局1.1 效果预览1.2 实现思路1.3 custom-page 组件全量代码1.4 页面使用 二、普通页面布局2.1 效果预览2.2 实现思路2.3 公共样式部分2.4 页面使用 三、分页表单页面布局3.1 效果预览3.2 实现思路3.3 页面代码 简介 开发工具&#xff1a;VsCode…...

虚拟机缩放比例问题处理

上班打开虚拟机的样子。 最开始判断可能是vmtools 异常重启安装后发现没有效果 通过 xrandr 功能查询显示器信息获取显示器名 设置显示器 同时设置分辨率 也可以同时设置刷新率 注意下图中设置的关键字...

bean的管理-03.第三方bean

一.第三方bean的定义 对于我们自己定义的类&#xff0c;如果想要将其注入到IOC容器当中&#xff0c;可以使用Component&#xff0c;Controller&#xff0c;Service&#xff0c;Repository注解。但是对于第三方的类来说&#xff0c;并不能使用以上注解来定义&#xff0c;因此我…...

【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…...

DeepSeek-R1-Zero:基于基础模型的强化学习

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列四DeepSeek大模型技术系列四》DeepSeek-…...

(dp 买入股票的最佳时机)leetcode 121

题目 题解的dp数组 0列是负数&#xff0c;这里我改成正数不再相加而是相减获取利润 class Solution { public:int maxProfit(vector<int>& prices) {int nprices.size();vector<vector<int>>dp(n,vector<int>(2));dp[0][0]prices[0];dp[0][1]0;//0…...

由 Mybatis 源码畅谈软件设计(三):简单查询 SQL 执行流程

大家好&#xff0c;我是 方圆。SQL 查询是 Mybatis 中的核心流程&#xff0c;本节我们来介绍简单 SQL 的执行流程&#xff0c;过程会比较长&#xff0c;期间会认识很多重要的组件&#xff0c;比如 SqlSession、四大处理器&#xff08;Executor、StatementHandler、ParameterHan…...

项目实践 之 pdf简历的解析和填充(若依+vue3)

文章目录 环境背景最终效果前端讲解左侧模块解析右侧上传模块解析前端步骤 后端讲解代码前端 环境背景 若依前后端分离框架 vue最后边附有代码哦 最终效果 前端讲解 左侧模块解析 1、左侧表单使用el-form 注意&#xff1a; 1、prop出现的字段&#xff0c;需要保证是该类所…...

C语言机试编程题

编写版本&#xff1a;vc2022 1.求最大/小值 #include<stdio.h> int main(){int a[50],n;int max, min;printf("请输入您要输入几个数");scanf_s("%d", &n);printf("请输入您要比较的%d个数\n",n);for (int i 0; i<n; i) {scanf_…...

lowagie(itext)老版本手绘PDF,包含页码、水印、图片、复选框、复杂行列合并、行高设置等。

入口类&#xff1a;exportPdf package xcsy.qms.webapi.service;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.StringUtils; import com.ibm.icu.text.RuleBasedNumberFormat; import com.lowagie…...

第002文-kali虚拟机安全与网络配置

1、kali系统介绍 kali是一个基于Linux kernel的操作系统&#xff0c;由BackTrack(简称BT)发展而来。BackTrack是2006年推出的一个用于渗透测试及黑客攻防的专用平台&#xff0c;基于Knoppix(linux的一个发行版)开发。BackTrack版本周期&#xff1a;2006年的起始版本BackTrack …...

软件工程复试专业课-软件生命周期

文章目录 软件过程模型瀑布模型模型图特点优缺点改进后的瀑布模型 快速原型模型模型图优缺点 增量模型&#xff08;迭代-递增模型&#xff09;原型图与瀑布和快速原型的区别优缺点风险更大的增量模型 螺旋模型简介模型图优缺点 喷泉模型模型图优缺点 编码修补模型敏捷过程优缺点…...