LUOGU P4159 [SCOI2009]迷路(矩阵乘法)
解题思路
以前bpw讲过的一道题,顺便复习一下矩阵乘法。做法就是拆点,把每个点拆成\(9\)个点,然后挨个连边。之后若\(i\)与\(j\)之间的边长度为\(x\),就让\(i\)的第\(x\)个点和\(j\)的第\(1\)个点连边。然后就是一个矩阵快速幂,时间复杂度\(O((n*9)^3log(n*9))\)。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN = 15;
const int MOD = 2009;
typedef long long LL;
int n,T,cnt;
LL ans;
char s[MAXN];
struct Matrix{
int a[105][105];
void Clear(){
memset(a,0,sizeof(a));
}
friend Matrix operator*(const Matrix A,const Matrix B){
Matrix C;C.Clear();
for(register int i=1;i<=90;i++)
for(register int j=1;j<=90;j++)
for(register int k=1;k<=90;k++)
(C.a[i][j]+=((LL)A.a[i][k]*B.a[k][j]%MOD))%=MOD;
return C;
}
}mp,pre;
inline void fast_pow(Matrix x,int y){
for(;y;y>>=1){
if(y&1) pre=pre*x;
x=x*x;
}
}
int main(){
int x;
scanf("%d%d",&n,&T);cnt=n;
for(int i=1;i<=n;i++)
for(int j=1;j<=8;j++)
mp.a[(i-1)*9+j][(i-1)*9+j+1]=1;
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=n;j++){
x=s[j]-'0';if(x==0) continue;
mp.a[(i-1)*9+x][(j-1)*9+1]=1;
}
}
pre.Clear();n=n*9;
for(int i=1;i<=n;i++) pre.a[i][i]=1;
fast_pow(mp,T);
cout<<pre.a[1][n-8]<<endl;
return 0;
}
LUOGU P4159 [SCOI2009]迷路(矩阵乘法)的更多相关文章
- Luogu P4159 [SCOI2009]迷路 矩阵快速幂+精巧转化
大致就是矩阵快速幂吧.. 这个时候会发现这些边权$\le 9$,然后瞬间想到上回一道题:是不是可以建一堆转移矩阵再建一个$lcm(1,2,3,4,5,6,7,8,9)$的矩阵?...后来发现十分的慢q ...
- BZOJ1297 [SCOI2009]迷路 矩阵乘法
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1297 题意概括 有向图有 N 个节点,从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. ...
- 【bzoj1297】[SCOI2009]迷路 矩阵乘法
题目描述 给出一个 $n$ 个点的有向图,每条边的权值都在 $[1,9]$ 之间.给出 $t$ ,求从 $1$ 到 $n$ ,经过路径边权和恰好为 $t$ 的方案数模2009. 输入 第一行包含两个整 ...
- [luogu4159 SCOI2009] 迷路(矩阵乘法)
传送门 Solution 矩阵乘法新姿势qwq 我们知道当边权为1是我们可以利用矩阵快速幂来方便的求出路径数 那么对于边权很小的时候,我们可以将每个点都拆成若干个点 然后就将边权不为1转化为边权为1了 ...
- bzoj1297: [SCOI2009]迷路(矩阵乘法+拆点)
题目大意:有向图里10个点,点与点之间距离不超过9,问从1刚好走过T距离到达n的方案数. 当时看到这题就想到了某道奶牛题(戳我).这两道题的区别就是奶牛题问的是走T条边,这道题是每条边都有一个边权求走 ...
- bzoj1297 / P4159 [SCOI2009]迷路
P4159 [SCOI2009]迷路 如果边权只有 0/1 那么不就是一个灰常简单的矩阵快速幂吗! 然鹅边权 $<=9$ 所以我们把每个点拆成9个点! 解决~ #include<iostr ...
- [SCOI2009]迷路(矩阵快速幂) 题解
Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...
- [bzoj1297] [洛谷P4159] [SCOI2009] 迷路
Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...
- Luogu P3758 [TJOI2017]可乐 | 矩阵乘法
题目链接 让我们先来思考一个问题,在一张包含$n$个点的图上,如何求走两步后从任意一点$i$到任意一点$j$的方案数. 我们用$F_p(i,j)$来表示走$p$步后从$i$到$j$的方案数,如果存储原 ...
随机推荐
- C#编程入门--MYSQLHELPER
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- Tomcat7安装和配置以及优化
安装Tomcat7 下载安装方法一: 直接下载Tomcat7: wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0 ...
- python 将字符串转换成字典dict
JSON到字典转化:>>>dictinfo = json.loads(json_str) 输出dict类型 字典到JSON转化:>>>jsoninfo = json ...
- msql数据库基础
一.数据库操作 1.显示数据库 SHOW DATABASES; SHOW CREATE DATABASE 数据库名称; #数据库的创建信息 2.创建数据库 #utf8 CREATE DATABASE ...
- 过滤掉map集合中key或value为空的值
package cn.com.utils; import org.apache.commons.lang3.StringUtils; import java.util.Collection; impo ...
- NX二次开发-UFUN创建倒角UF_MODL_create_chamfer
NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建块 UF_FEATURE_SIGN S ...
- NXOpenC#_Training_cam(cn)【转载】
- JS常见的报错类型
解决错误前,首先要学会阅读报错信息 eg:Uncaught TypeError: ... is not a function Uncaught 表示没有被catch语句捕获到的错误 TypeError ...
- csp-s模拟测试98
csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...
- Matlab中的lambda表达式 f=@(x) x^2-2*x+1;
Matlab中的lambda表达式 f=@(x) x^-*x+;