洛谷4159 [SCOI2009] 迷路(矩阵快速幂,拆点)
题意:该有向图有 n 个节点,节点从 1至 n 编号,windy 从节点 1 出发,他必须恰好在 t 时刻到达节点 n。现在给出该有向图,你能告诉 windy 总共有多少种不同的路径吗?答案对2009取模。(洛谷 4159)
输入格式:第一行包含两个整数,分别代表 n和 t。第 2 到第 (n + 1)行,每行一个长度为 n 的字符串,第 (i + 1)行的第 j 个字符c [ i ] [ j ]是一个数字字符,若为 0,则代表节点 i 到节点 j 无边,否则代表节点 i 到节点 j 的边的长度为c [ i ] [ j ]。
输出格式:输出一行一个整数代表答案对 2009取模的结果。
数据范围: 2 ≤ n ≤ 10 , 1 ≤ t ≤ 1e9。
分析:首先考虑边权只有 $0,1$ 的情况。令 $f_1=$给定矩阵。因为边权只有 $0,1$,所以我们可以将这个矩阵的意义转化成: $f_t[i][j]=k \Longleftrightarrow$ $i$到 $j$的长度为 $t$的路径条数为 $k$。显然有 $f_t[i][j]=\sum\limits_{k=1}^nf_{t-1}[i][k]\times f_1[k][j]$。
矩阵乘法满足结合律,故 $f_t=f_1^t$。于是这种情况下答案就是 $f_T[1][n]$。考虑边权 $w\in [0,9]\cap\mathbb Z$ 的情况。因为边权可能大于1,所以给定矩阵不能直接转换成那种含义了。但是我们发现 $n\le 10$。这意味着我们可以将每个点都拆开,将这张图转化成边权只有 $0,1$ 的图,这样上面的意义就成立了。
我们发现可以将每个点拆成 $9$ 个点,令有序数对 $(i,j)(i\in [1,n]\cap\mathbb Z,j\in [0,8]\cap\mathbb Z)$ 表示点 $i$ 拆成的第 $j$ 个点,其中第 $0$ 个点是“真”点,其余的是“假”点。我们可以令 $(i,j)(j\in [1,8]\cap\mathbb Z)$ 表示到“真”点 $(i,0)$ 的距离为 $j$ 的“假”点,只要让 $(i,j)(j\in [1,8]\cap\mathbb Z)$ 向 $(i,j-1)$ 连一条边权为 $1$ 的边。这样我们就还原了原图中的边,并且将边权都转化成了 $0,1$。而每个 $(i,j)$ 又可以唯一对应一个编号 $i+j\times n$,因此原矩阵就变成了一个 $9n\times 9n$ 的矩阵 $f_1$。根据前面的推理,同样 $f_t=f_1^t$。答案就是 $f_T[1][n]$。
#include<cstdio>
#include<cstring>
const int mod = 2009; int n,T,m,x; struct Node{
int a[100][100];
Node operator *(const Node &x)const{
Node ans;
memset(ans.a,0,sizeof(ans.a));
for(int i = 1; i <= m; ++i)
for(int t = 1; t <= m; ++t)
for(int k = 1; k <= m; ++k)
ans.a[i][t] = (ans.a[i][t]+a[i][k]*x.a[k][t]) % mod;
return ans;
}
}res,ans; inline int cal(int x,int y){ return x+y*n; } void quick_pow(int k){
ans = res;
while(k){
if(k&1) ans = ans*res;
res = res*res; k >>= 1;
}
} int main(){
scanf("%d%d",&n,&T); m = 9*n;
for(int i = 1; i <= n; ++i){
for(int t = 1; t <= 8; ++t)
res.a[cal(i,t)][cal(i,t-1)] = 1;
for(int t = 1; t <= n; ++t){
scanf("%1d",&x);
if(x) res.a[i][cal(t,x-1)] = 1;
}
}
quick_pow(T-1);
printf("%d",ans.a[1][n]);
return 0;
}
原文链接:https://www.luogu.com.cn/blog/samxiang/solution-p4159
洛谷4159 [SCOI2009] 迷路(矩阵快速幂,拆点)的更多相关文章
- BZOJ1297: [SCOI2009]迷路 矩阵快速幂
Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...
- BZOJ 1297: [SCOI2009]迷路 [矩阵快速幂]
Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...
- Luogu P4159 [SCOI2009]迷路 矩阵快速幂+精巧转化
大致就是矩阵快速幂吧.. 这个时候会发现这些边权$\le 9$,然后瞬间想到上回一道题:是不是可以建一堆转移矩阵再建一个$lcm(1,2,3,4,5,6,7,8,9)$的矩阵?...后来发现十分的慢q ...
- 【洛谷 p3390】模板-矩阵快速幂(数论)
题目:给定n*n的矩阵A,求A^k. 解法:利用矩阵乘法的定义和快速幂解答.注意用负数,但是数据太弱没有卡到我......(P.S.不要在 typedef long long LL; 前使用 LL. ...
- [SCOI2009]迷路(矩阵快速幂) 题解
Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...
- 洛谷 P1226 【模板】快速幂||取余运算
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...
- BZOJ 1297 迷路(矩阵快速幂)
很容易想到记忆化搜索的算法. 令dp[n][T]为到达n点时时间为T的路径条数.则dp[n][T]=sigma(dp[i][T-G[i][n]]); 但是空间复杂度为O(n*T),时间复杂度O(n*n ...
- 洛谷P1226 【模板】快速幂||取余运算
题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod k=s” s为运算结果 S1: ...
- 洛谷P1313 计算系数【快速幂+dp】
P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...
- 洛谷——P1226 取余运算||快速幂
P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod ...
随机推荐
- 文心一言 VS 讯飞星火 VS chatgpt (76)-- 算法导论7.3 1题
一.如果用go语言,为什么我们分析随机化算法的期望运行时间,而不是其最坏运行时间呢? 文心一言: 在分析算法的性能时,期望运行时间是一个重要的指标,它描述了算法在平均情况下的表现.期望运行时间考虑了所 ...
- Netty源码学习2——NioEventLoop的执行
系列文章目录和关于我 零丶引入 在<Netty源码学习1--NioEventLoopGroup的初始化>中,我们学习了NioEventLoopGroup和NioEventLoop的初始化, ...
- Python+Flask接口实现简单的ToKen功能
话不多说,上代码 from flask import request, jsonify from functools import wraps class TokenRequired: @classm ...
- 产品代码都给你看了,可别再说不会DDD(五):请求处理流程
这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...
- WPF 自定义窗体(一)
.Net默认的窗体样式只有四种:None.SingleBorderWindow.ThreeDBorderWindow.ToolWindow,都比较"丑".而很多时候,我们希望自定义 ...
- 记录一个令人崩溃的tomcat闪退问题
tomcat启动时要加载server.xml文件,xml文件中的注释符要一一对应不能多不能少. 比如 这就是错的 只有这样 才是对的 呜呜呜~~~
- golang .(type)语法
一直弄不懂 .(type) 是啥,在 liteide 中输出 (1+1).(type),提示: use of .(type) outside type switch 于是搜索到这个文章: 作者:翔云翔 ...
- 关于Word转PDF的几种实现方案
在.NET中,你可以使用Microsoft.Office.Interop.Word库来进行Word到PDF的转换.这是一个示例代码,但请注意这需要在你的系统上安装Microsoft Office. 在 ...
- junit4单元测试报错Invalid project specified
junit4单元测试报错Invalid project specified. 前天在进行单元测试的时候出现了Invalid project specified的报错查了一下发现是项目名字的问题.项目名 ...
- mybatis-plus使用心得
mybatis-plus是一款基于mybatis的持久层框架,在mybatis上只做增强不做改变.基本使用流程: 导入依赖坐标: <dependency> <groupId>c ...