[SCOI 2009] 迷路 (矩阵快速幂)
[SCOI 2009]迷路
问题描述
Windy 在有向图中迷路了。 该有向图有 \({N}\) 个节点,Windy 从节点 \({1}\) 出发,他必须恰好在 \({T}\) 时刻到达节点 \({N}\)。
现在给出该有向图,你能告诉 Windy 总共有多少种不同的路径吗?
注意:Windy 不能在某个节点逗留,且通过某有向边的时间严格为给定的时间。
输入格式:
第一行包含两个整数,\({N,T}\);
接下来有 \({N}\) 行,每行一个长度为 \({N}\) 的字符串。第 \({i}\) 行第 \({j}\) 列为 \({0}\) 表示从节点 \({i}\) 到节点 \({j}\) 没有边,为 \({1}\) 到 \({9}\) 表示从节点 \({i}\) 到节点 \({j}\) 需要耗费的时间。
输出格式:
包含一个整数,可能的路径数,这个数可能很大,只需输出这个数除以 \({2009}\) 的余数。
样例输入1:
2 2
11
00
样例输出1:
1
样例说明1:
\({1→1→2}\)
样例输入2:
5 30
12045
07105
47805
12024
12345
样例输出2:
852
说明:
对于 \({ 30 \% }\) 的数据,满足 \({2 \leq N \leq 5,1 \leq T \leq 30}\);
对于 \({ 100 \% }\) 的数据,满足 \({2 \leq N \leq 10,1 \leq T \leq 10^9}\)。
分析
1.这dio图里怎么还有自环呢?
哦 凑时间用的
2.既然是个图 那就画出来看看叭(过于抽象以至于未完成)

实在蚌埠住了
3.乂~它在矩阵快速幂专题里面诶,那就先打个板子叭
(打板子ing)
既然是矩阵快速幂,那肯定要推递推式啊
\({\large 试试就逝世}\)
假如输入是个邻接矩阵
我们先不看边权(假设边权都为1) 无权的都推不出来还推什么带权的
显而易得
这个邻接矩阵自乘\({T}\)次之后 \({a[1][n]}\) 就是答案
设\({F[i,j]}\)表示\({i \sim j}\)
若有连边则说明\({i \sim j}\)有一种路径
那么\({a[i][k]*a[k][j]}\)就相当于从\({i}\)走到\({k}\)的方案数乘以从\({k}\)到\({j}\)的方案数
将所有的\({a[i][k]*a[k][j]}\)加起来 就能得到多走\({1}\)的方案数
于是就有了方程:
\({\large F_t=\sum_{k=1}^n {f_{t-1}}[i,k] * f_1[k,j]}\)
所以\({F_1}\)就是最原始的矩阵aaaaaaaaa
但问题在于 这个矩阵的边权不为\({1}\)aaaaaaaaaaa
————————————————————
问佬佬()
。。。。。。。。。。。。。。。。。。。。。。
学成归来
————————————————————
于是我们知道了一个叫做拆点的东东
由于上限为9
我们将\({1}\)个点拆成\({9}\)个点,第\({i}\)个点拆成的第\({j-1}\)个点向第\({j}\)个点连一条边权为\({1}\)的边
那么\({i \sim j}\)有一条边权为\({k}\)的边等价于\({i}\)向\({j}\)拆成的第\({k}\)个点连边
最后再跑一遍矩阵快速幂就好啦~~~
code
Elaina's code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define INF 0x7fffffff
#define mst(a,b) memset(a,b,sizeof(a))
#define Elaina 0
const int N = 15;
const int mod = 2009;
int n,sn,t;
struct Mat{
int n,m;
int a[N*9][N*9];
void clean(){
mst(a,0);
}
void unit(){
clean();
for(int i=1;i<=n;i++){
a[i][i]=1;
}
}
void resize(int x,int y){
n=x,m=y;
}
Mat operator * (const Mat &A) const {
Mat res;
res.resize(n,n);
res.clean();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
res.a[i][j]=(a[i][k]*A.a[k][j]+res.a[i][j])%mod;
}
}
}
return res;
}
};
Mat qpow(Mat A,int b){
Mat res;
res.resize(n,n);
res.unit();
while(b){
if(b&1){
res=res*A;
}
A=A*A;
b>>=1;
}
return res;
}
Mat mat;
signed main(){
cin>>n>>t;
sn=n;
n*=9;
char x[N];
mat.resize(n,n);
for(int i=1;i<=sn;i++){
for(int j=1;j<=8;j++){
mat.a[(i-1)*9+j+1][(i-1)*9+j]=1;
}
}
for(int i=1;i<=sn;i++){
scanf("%s",x+1);
for(int j=1;j<=sn;j++){
if(x[j]>'0'){
mat.a[(j-1)*9+1][(i-1)*9+x[j]-'0']=1;
}
}
}
mat=qpow(mat,t);
cout<<mat.a[sn*9-8][1]%mod;
return Elaina;
}
都看到这了,真的不点个赞吗(>ω<*)
[SCOI 2009] 迷路 (矩阵快速幂)的更多相关文章
- BZOJ1297: [SCOI2009]迷路 矩阵快速幂
Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...
- BZOJ 1297: [SCOI2009]迷路 [矩阵快速幂]
Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...
- BZOJ 1297 迷路(矩阵快速幂)
很容易想到记忆化搜索的算法. 令dp[n][T]为到达n点时时间为T的路径条数.则dp[n][T]=sigma(dp[i][T-G[i][n]]); 但是空间复杂度为O(n*T),时间复杂度O(n*n ...
- Luogu P4159 [SCOI2009]迷路 矩阵快速幂+精巧转化
大致就是矩阵快速幂吧.. 这个时候会发现这些边权$\le 9$,然后瞬间想到上回一道题:是不是可以建一堆转移矩阵再建一个$lcm(1,2,3,4,5,6,7,8,9)$的矩阵?...后来发现十分的慢q ...
- [SCOI2009]迷路(矩阵快速幂) 题解
Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...
- 【矩阵快速幂】bzoj1297 [SCOI2009]迷路
1297: [SCOI2009]迷路 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1407 Solved: 1007[Submit][Status ...
- 【BZOJ1297】[SCOI2009]迷路(矩阵快速幂)
[BZOJ1297][SCOI2009]迷路(矩阵快速幂) 题面 BZOJ 洛谷 题解 因为边权最大为\(9\),所以记录往前记录\(9\)个单位时间前的.到达每个点的方案数就好了,那么矩阵大小就是\ ...
- 2018.10.23 bzoj1297: [SCOI2009]迷路(矩阵快速幂优化dp)
传送门 矩阵快速幂优化dp简单题. 考虑状态转移方程: f[time][u]=∑f[time−1][v]f[time][u]=\sum f[time-1][v]f[time][u]=∑f[time−1 ...
- bzoj1297 [SCOI2009]迷路——拆点+矩阵快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1297 一看感觉是矩阵快速幂之类的,但边权不好处理啊: 普通的矩阵快速幂只能处理边权为1的,所 ...
- poj4474 Scout YYF I(概率dp+矩阵快速幂)
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4100 Accepted: 1051 Descr ...
随机推荐
- DataSet类型转换实体
查询DataSet类型无法对每条数据进行循环转换,利用泛型对象使用反射机制将对象相关属性进行自动赋值. 基础调用 DataSet ds = DbHelper.Query(SQL); if (ds.Ta ...
- dropzone基本使用
dropzone是一个实现拖拽上传文件的一个插件. 生成拖拽区域 1 <div style="width: 1078px;margin: 0 auto;border: 2px ligh ...
- 【OpenCV】在Linux上使用OpenCvSharp
前言 OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Androi ...
- Ubuntu22.04 & Win11 双系统hibernate热切换实现
Ubuntu22.04 & Win11 双系统hibernate热切换实现 目录 Ubuntu22.04 & Win11 双系统hibernate热切换实现 修改交换分区或交换文件 修 ...
- 苹果iOS的应用移除主屏幕及恢复找回
昨天刷到一个苹果iOS系统更换微信图标的,然后就添加了一个,发现那个记录通知数字问题,想恢复回来,所以就有了此文. https://www.cnblogs.com/lzhdim/p/17909867. ...
- 性价比超频我都要 两大内存绝技带来20%性能提升!技嘉雪雕Z790 AORUS LITE AX-W主板评测
一.前言:主打性价比.两大内存绝技加持的技嘉Z790主板 要说现在最主流的装机方案,那必然是13代酷睿+700系主板.我们此前曾测试过技嘉的Z790钛雕主板,独有的顶级表现让人印象深刻,不过近6K的价 ...
- 【Linux】root密码忘记了怎么办【技能篇】一分钟教会你重置root密码
[Linux]root密码重置 文章目录 前言介绍 操作步骤 尾声 前言介绍 那么这里博主先安利一下一些干货满满的专栏啦! 数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是 ...
- 穿透 SESSION 0 隔离
注:这套程序在这里只是作为了解,博主本人并未测试,所有测试均来自文章最底层链接的原文章. 查看目标进程运行的SESSION位置 在实际开发过程中,可以通过Process Explorer 检查服务或程 ...
- macOS 上 常用的操作
首先 mac上 若使用的是windows的键盘,那么需要把ctrl 键,设置成 cmd键,因为mac上大多数操作都是 基于cmd键. 1.将ctrl键,修改为cmd键,这样后 复制.粘贴.剪切.全选等 ...
- Java集合篇之set,面试官:请说一说HashSet、LinkedHashSet、TreeSet的区别?
写在开头 Java的集合世界中主要由List,Set,Queue,Map构成,我们在之前的博文中已经学习了List,接下来我们继续学习Set集合. Set特点:存取无序,不可以存放重复的元素,不可以用 ...