洛谷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 ...
随机推荐
- 【python笔记】高阶函数map、filter、reduce
前言 map().reduce().filter()是python的三个高阶函数.所谓高阶函数,指的是将函数作为参数并返回函数作为结果的函数.下面代码的sing_ready只是一个简单高阶函数示例: ...
- Python字符串操作函数split()和join()
字符串拆分 在python中有切片(Slice)操作符,可以对字符串进行截取,还提供了split()函数可以将一个 字符串分裂成多个字符串组成的列表.在使用split()函数来拆分字符串之前,我们先来 ...
- 在编写API接口的技术文章时应注意的内容
编写API接口的技术文章时,建议包含以下内容: 1. 简介:介绍API接口的目的和作用,以及所属的项目或服务. 2. 接口描述:详细描述API接口的功能和使用方法,包括输入参数.输出结果和可能的错误码 ...
- ATtiny88初体验(六):SPI
ATtiny88初体验(六):SPI SPI介绍 ATtiny88自带SPI模块,可以实现数据的全双工三线同步传输.它支持主从两种模式,可以配置为LSB或者MSB优先传输,有7种可编程速率,支持从空闲 ...
- vue列表逐个进入过渡动画
vue实现列表依次逐渐进入动画 利用vue 中transition-group 实现列表逐个进入动画效果 1.vue3代码, <template> <section class=&q ...
- 使用 Python ssh 远程登陆服务器的最佳方案
在使用 Python 写一些脚本的时候,在某些情况下,我们需要频繁登陆远程服务去执行一次命令,并返回一些结果. 在 shell 环境中,我们是这样子做的. sshpass -p ${passwd} s ...
- 树莓派4b装系统到运行 Blazor Linux 本地程序全记录
在Linux下运行gui程序,咱也是第一次做,属于是瞎子过河乱摸一通,写得有什么不对和可以优化的地方,希望各位看官斧正斧正. 1. 下载烧录器 https://www.raspberrypi.com/ ...
- Teamcenter RAC 开发之《新建Item》
private TCComponentItem createOperation(String itemName,String itemType) { //obejct_name itemType tr ...
- spark修改控制台输出日志级别
spark修改控制台输出日志级别 修改conf/log4j.properties cd $SPARK_HOME/conf cp log4j.properties.template ./log4j.pr ...
- Jenkins 命令执行 -- jetty 敏感信息泄露 --(CVE-2021-2816)&&(CVE-2017-1000353)&&(CVE-2018-1000861)
Jenkins 命令执行 -- jetty 敏感信息泄露 --(CVE-2021-2816)&&(CVE-2017-1000353)&&(CVE-2018-100086 ...