[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 ...
随机推荐
- Python 实现ARP扫描与欺骗
ARP欺骗又称ARP毒化或ARP攻击,是针对以太网地址解析协议ARP的一种攻击技术,通过欺骗局域网内访问者PC的网关MAC地址,使访问者PC错以为攻击者更改后的MAC地址是网关的MAC,导致网络不通. ...
- C/C++ Npcap包实现数据嗅探
npcap 是Nmap自带的一个数据包处理工具,Nmap底层就是使用这个包进行收发包的,该库,是可以进行二次开发的,不过使用C语言开发费劲,在进行渗透任务时,还是使用Python构建数据包高效,这东西 ...
- 最新力作,爱来自rand函数
AWCU47EF;D5F]ET[a8a9K6G5IRHB6RS\cD8YDC:AGN<Z@6ZI3ab8D3O3La7:Sc;5_B]BS5S6Q]baWGcTE94IX7cW=9F>BJ ...
- NC207569 牛牛爱奇数
题目链接 题目 题目描述 在牛牛面前放着 \(n\) 个数,这些数字既有奇数也有偶数,只不过牛牛对奇数情有独钟,他特别想让这些数都变成奇数. 现在牛牛获得了一种能力,他可以执行一种操作:每次选中一个偶 ...
- Js中Math对象
Js中Math对象 Math是一个内置对象,它拥有一些数学常数属性和数学函数方法,Math用于Number类型,其不支持BigInt. 描述 Math不是一个函数对象,也就是说Math不是一个构造器, ...
- gitlab+jenkins+docker持续集成环境搭建实战
介绍 什么是持续集成? 持续集成(CI)是在源代码变更后自动检测.拉取.构建和(在大多数情况下)进行单元测试的过程.持续集成是启动管道的环节(尽管某些预验证 -- 通常称为 上线前检查(pre-fli ...
- Nginx开启gzip提升访问效率
说明 最近网站考虑开启gzip压缩试试效果,gzip是nginx服务器的ngx_http_gzip_module模块提供的在线实时数据压缩功能. 通过开启gzip功能,可对服务器响应的数据进行压缩处理 ...
- 《深入理解Java虚拟机》(五) JVM调优案例
目录 问题 排查问题经过了如下的过程: 排除是否数据库卡顿造成 任务管理器 与客户沟通 至此开始通过JVM排查问题: JVM参数介绍 第一次Full GC 第二次Full GC截图 第三次Full G ...
- 原来你是这样的JAVA--[07]聊聊Integer和BigDecimal
今天来聊聊Java中跟数值处理相关的两个类型Integer和BigDecimal. 说起这两个类型,我们肯定都不陌生,但是其中有些容易踩到的坑需要注意避让. Integer 整型我们应该每天都会用到, ...
- collections模块下的defaultdict用法
defaultdict from collections import defaultdict s=[('yellow',1),('blue', 2), ('yellow', 3), ('blue', ...