BZOJ1297 [SCOI2009]迷路 矩阵乘法
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1297
题意概括
有向图有 N 个节点,从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1。 现在给出该有向图,问总共有多少种不同的路径吗? 注意:不能在某个节点逗留,且通过某有向边的时间严格为给定的时间。
题解
矩阵乘法。
把一个点拆成9个,分别是time+0,time+1,time+2,...,time+8。
然后根据输入转移,构建矩阵即可。
然后基础矩阵跑一跑就可以了。
插曲
悲催,一个小错找了1个小时:
把设置单位矩阵打成这样了……
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=10+5,maxm=N*10,mod=2009;
int n,m,t;
char str[N][N];
struct Mat{
int v[maxm][maxm];
void set(){
memset(v,0,sizeof v);
}
void set1(){
set();
for (int i=0;i<m;i++)
v[i][i]=1;
}
Mat operator * (Mat a){
Mat ans;
ans.set();
for (int i=0;i<m;i++)
for (int j=0;j<m;j++)
for (int k=0;k<m;k++)
ans.v[i][j]=(ans.v[i][j]+v[i][k]*a.v[k][j])%mod;
return ans;
}
}M,Mans;
Mat MatPow(Mat x,int y){
Mat M,xx=x;
M.set1();
while (y){
if (y&1)
M=M*xx;
xx=xx*xx;
y>>=1;
}
return M;
}
int Hash(int x,int y){
return x*9+y;
}
int main(){
scanf("%d%d",&n,&t);
m=n*9;
for (int i=0;i<n;i++)
scanf("%s",str[i]);
M.set();
for (int i=0;i<n;i++)
for (int j=0;j<8;j++)
M.v[Hash(i,j+1)][Hash(i,j)]++;
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
if (str[i][j]!='0')
M.v[Hash(i,0)][Hash(j,str[i][j]-'1')]++;
Mans=MatPow(M,t);
printf("%d",Mans.v[0][Hash(n-1,0)]);
return 0;
}
BZOJ1297 [SCOI2009]迷路 矩阵乘法的更多相关文章
- bzoj1297: [SCOI2009]迷路(矩阵乘法+拆点)
题目大意:有向图里10个点,点与点之间距离不超过9,问从1刚好走过T距离到达n的方案数. 当时看到这题就想到了某道奶牛题(戳我).这两道题的区别就是奶牛题问的是走T条边,这道题是每条边都有一个边权求走 ...
- 【bzoj1297】[SCOI2009]迷路 矩阵乘法
题目描述 给出一个 $n$ 个点的有向图,每条边的权值都在 $[1,9]$ 之间.给出 $t$ ,求从 $1$ 到 $n$ ,经过路径边权和恰好为 $t$ 的方案数模2009. 输入 第一行包含两个整 ...
- [luogu4159 SCOI2009] 迷路(矩阵乘法)
传送门 Solution 矩阵乘法新姿势qwq 我们知道当边权为1是我们可以利用矩阵快速幂来方便的求出路径数 那么对于边权很小的时候,我们可以将每个点都拆成若干个点 然后就将边权不为1转化为边权为1了 ...
- LUOGU P4159 [SCOI2009]迷路(矩阵乘法)
传送门 解题思路 以前bpw讲过的一道题,顺便复习一下矩阵乘法.做法就是拆点,把每个点拆成\(9\)个点,然后挨个连边.之后若\(i\)与\(j\)之间的边长度为\(x\),就让\(i\)的第\(x\ ...
- BZOJ1297: [SCOI2009]迷路 矩阵快速幂
Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...
- [Bzoj1297][Scoi2009 ]迷路 (矩阵乘法 + 拆点)
1297: [SCOI2009]迷路 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1385 Solved: 993[Submit][Status] ...
- 【矩阵快速幂】bzoj1297 [SCOI2009]迷路
1297: [SCOI2009]迷路 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1407 Solved: 1007[Submit][Status ...
- [SCOI2009]迷路(矩阵快速幂) 题解
Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...
- BZOJ1297 [SCOI2009]迷路 【矩阵优化dp】
题目 windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意: ...
随机推荐
- Telnet Protocol Specification
Network Working Group J. Postel Request for Comments: 854 J. Reynolds ISI Obsoletes: NIC 18639 May 1 ...
- leetCode- 472. Concatenated Words
因为每个组合的字符串,至少要有3个index. 起点,中间拼接点,结点.所以可以将字符串分解为子字符串,判断子字符串是否存在.但是,后面字符串的存在必须要在前面字符串已经存在基础上判断. class ...
- tr 设置margin、padding无效
tr.td设置margin 无效 tr 设置padding无效.td设置padding有效
- Centos7.5 防火墙设置
Centos7.5默认使用firewalld作为防火墙 1.查看firewalld服务状态 systemctl status firewalld 2.查看firewalld的状态 firewall-c ...
- SANS社区邮件情报收集【2018-12-4到2019-1-19】
情报来源:注册SANS社区帐号,它提示是否接收邮件咨询等信息,肯定要接收.耳朵听不到东西,天才都变成傻子. 信息点:1.全世界安全员使用它,有培训和免费资源.2.可选择性接收特别网络安全课程,峰会和事 ...
- python3之Django多数据库
1.定义数据库 在django项目中, 一个工程中存在多个APP应用很常见:有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接.在Django的setting中使用DATABASE ...
- UML和模式应用5:细化阶段(6)---操作契约
1.前言 操作契约使用前置和后置条件,描述领域模型里对象的详细变化,作为系统操作的结果. 操作契约可以作为有用的OOA相关的制品. 操作契约可以视为UP用例模型的一部分,它是对用例之处的系统操作的效用 ...
- 蓝牙Bluetooth技术手册规范下载【转】
蓝牙Bluetooth技术手册规范下载 http://www.crifan.com/summary_bluetooth_specification_download/ [背景] 之前就已经整理和转帖了 ...
- python实现监控windows服务控制开关服务
转载自 :http://www.jb51.net/article/49106.htm #!/usr/bin/env python #-*- encoding:utf-8 -*- "" ...
- des结合base64加解密的python源码
#coding=utf8 from pyDes import * import base64 class Crypt_Error(): pass """ des方法,de ...