首页 > 其他分享 >Luogu P4159 [SCOI2009] 迷路

Luogu P4159 [SCOI2009] 迷路

时间:2023-06-10 18:34:35浏览次数:42  
标签:Matrix int Luogu 样例 leq SCOI2009 P4159 include 节点

[SCOI2009] 迷路

题目背景

windy 在有向图中迷路了。

题目描述

该有向图有 \(n\) 个节点,节点从 \(1\) 至 \(n\) 编号,windy 从节点 \(1\) 出发,他必须恰好在 \(t\) 时刻到达节点 \(n\)。

现在给出该有向图,你能告诉 windy 总共有多少种不同的路径吗?

答案对 \(2009\) 取模。

注意:windy 不能在某个节点逗留,且通过某有向边的时间严格为给定的时间。

输入格式

第一行包含两个整数,分别代表 \(n\) 和 \(t\)。

第 \(2\) 到第 \((n + 1)\) 行,每行一个长度为 \(n\) 的字符串,第 \((i + 1)\) 行的第 \(j\) 个字符 \(c_{i, j}\) 是一个数字字符,若为 \(0\),则代表节点 \(i\) 到节点 \(j\) 无边,否则代表节点 \(i\) 到节点 \(j\) 的边的长度为 \(c_{i, j}\)。

输出格式

输出一行一个整数代表答案对 \(2009\) 取模的结果。

样例 #1

样例输入 #1

2 2
11
00

样例输出 #1

1

样例 #2

样例输入 #2

5 30
12045
07105
47805
12024
12345

样例输出 #2

852

提示

样例输入输出 1 解释

路径为 \(1 \to 1 \to 2\)。

数据规模与约定

  • 对于 \(30\%\) 的数据,保证 \(n \leq 5\),\(t \leq 30\)。
  • 对于 \(100\%\) 的数据,保证 \(2 \leq n \leq 10\),\(1 \leq t \leq 10^9\)。
//思路来自https://www.luogu.com.cn/blog/user38725/solution-p4159 
//发现边权只有1~9,所以我们可以暴力把一个点拆成9个点并按顺序连上
//然后一条边权为k的边就是从起点拆出的第k个点到终点拆出的第一个点连边
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>

using namespace std;

const int mod = 2009;
int n, t, num[521][13];
char ch[521];

struct Matrix {
	int matrix[114][514];
}ask;

Matrix operator * (const Matrix &a, const Matrix &b) {
	Matrix c;
	for (int i = 1; i <= n * 9; ++ i) {
		for (int j = 1; j <= n * 9; ++ j) {
			c.matrix[i][j] = 0;
			for (int q = 1; q <= n * 9; ++ q) {
				c.matrix[i][j] += (a.matrix[i][q] * b.matrix[q][j]);
				c.matrix[i][j] %= mod;
			}
		}
	}
	return c;//矩阵乘 
}

Matrix MatrixQuickPower(Matrix a,int k) {
	Matrix ans, base = a;
	for (int i = 1; i <= n * 9; ++ i) {
		for (int j = 1; j <= n * 9; ++ j) {
			if (i == j) ans.matrix[i][j] = 1;
			else ans.matrix[i][j] = 0;
		}
	}
	while (k > 0) {
		if (k & 1 == 1) {
			ans = ans * base;
		}
		base = base * base;
		k >>= 1;
	}
	return ans;
	//矩阵快速幂 
}

int main() {
	cin >> n >> t;
	for (int i = 1; i <= n; ++ i) {
		for (int j = 1; j <= 8; ++ j) {
			ask.matrix[9 * (i - 1) + j][9 *	(i - 1) + j + 1] = 1;
			//将一个点内的每个点顺序连上 
		}
	}
	for (int i = 1; i <= n; ++ i) {
		scanf("%s", ch + 1);
		for (int j = 1; j <= n; ++ j) {
			if (ch[j] > '0') {
				ask.matrix[9 * (i - 1) + ch[j] - '0'][9 * (j - 1) + 1] = 1;
				//把第i个点内的第k个点与第j个点的起始点连上 
			}
		}
	}
	Matrix ans = MatrixQuickPower(ask, t);
	//题目问的是从点1到点n的路径数 
	cout << (ans.matrix[1][n * 9 - 8]) % mod << endl;
	return 0;
}

标签:Matrix,int,Luogu,样例,leq,SCOI2009,P4159,include,节点
From: https://www.cnblogs.com/jueqingfeng/p/17471732.html

相关文章

  • P4159 [SCOI2009] 迷路
    目录题目链接题目内容前置知识:矩阵快速幂思路历程1.我寻思这图里咋还有自环呢2.ok快乐的板子时光总是短暂的()3.额我们还是不看边权,但是不扯到图上去了。4.那我们现在加上边权吧5.回归本题代码实现:题目链接题目内容[SCOI2009]迷路题目背景windy在有向图中迷路了。题目描述......
  • Luogu P1939 【模板】矩阵加速(数列)
    【模板】矩阵加速(数列)题目描述已知一个数列\(a\),它满足:\[a_x=\begin{cases}1&x\in\{1,2,3\}\\a_{x-1}+a_{x-3}&x\geq4\end{cases}\]求\(a\)数列的第\(n\)项对\(10^9+7\)取余的值。输入格式第一行一个整数\(T\),表示询问个数。以下\(T\)行,每行一个正......
  • Luogu P3390 【模板】矩阵快速幂
    【模板】矩阵快速幂题目背景一个\(m\timesn\)的矩阵是一个由\(m\)行\(n\)列元素排列成的矩形阵列。即形如\[A=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&......
  • Luogu B2105 矩阵乘法(模板)
    矩阵乘法题目描述计算两个矩阵的乘法。\(n\timesm\)阶的矩阵\(A\)乘以\(m\timesk\)阶的矩阵\(B\)得到的矩阵\(C\)是\(n\timesk\)阶的,且\(C[i][j]=A[i][0]\timesB[0][j]+A[i][1]\timesB[1][j]+\)……\(+A[i][m-1]\timesB[m-1][j](C[i][j]\)表示\(C\)......
  • Luogu P4219 [BJOI2014]大融合
    [BJOI2014]大融合题目描述小强要在\(N\)个孤立的星球上建立起一套通信系统。这套通信系统就是连接\(N\)个点的一个树。这个树的边是一条一条添加上去的。在某个时刻,一条边的负载就是它所在的当前能够联通的树上路过它的简单路径的数量。例如,在上图中,现在一共有了\(5\)......
  • Luogu P4577 [FJOI2018] 领导集团问题
    [FJOI2018]领导集团问题题目描述一个公司的组织领导架构可以用一棵领导树来表示。公司的每个成员对应于树中一个结点\(v_i\),且每个成员都有响应的级别\(w_i\)。越高层的领导,其级别值\(w_i\)越小。树中任何两个结点之间有边相连,则表示与结点相应的两个成员属于同一部门。领......
  • Luogu P5446 [THUPC2018] 绿绿和串串
    根据题目能发现一个性质,设转化前的字符串为\(s\),转化后的字符串为\(s'\),则\(s'_{|s|}\)为\(s'\)的中心,即\(s'_{|s|}\)求出来的回文串左边界为\(1\)右边界为\(|s'|\)找出这个性质就挺简单了,考虑先对给出的\(S\)用\(\text{manacher}\)求出每个节点\(i\)对应的左边......
  • Luogu P3224 [HNOI2012]永无乡
    [HNOI2012]永无乡题目描述永无乡包含\(n\)座岛,编号从\(1\)到\(n\),每座岛都有自己的独一无二的重要度,按照重要度可以将这\(n\)座岛排名,名次用\(1\)到\(n\)来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛到达另一个岛。如果从岛\(a\)出发经过若干座(含\(0\)......
  • [刷题笔记] Luogu P3073 [USACO13FEB]Tractor S
    ProblemSolution和汽车拉力比赛差不多,思路都是二分,二分\(d\),但是汽车拉力比赛从一个路标开始搜即可,本题没有给定起点。一条合法路径起点是未知的,不得随便从一个点开始搜,否则可能找不到正确路径。怎么处理呢?容易想到对于每一个二分的\(d\),开一个\(n^2\)的循环,从每一个点开始搜......
  • Luogu P3605 [USACO17JAN]Promotion Counting P
    [USACO17JAN]PromotionCountingP题目描述Thecowshaveonceagaintriedtoformastartupcompany,failingtorememberfrompastexperiencethatcowsmaketerriblemanagers!Thecows,convenientlynumbered\(1\ldotsN\)(\(1\leqN\leq100,000\)),o......