题意

边权\(w \in [1, 9]\)的\(n\)个结点的有向图,图上从\(1\)到\(n\)长度为\(d\)的路径计数,\(n \leq 10\).

题解

如果边权为\(1\)很经典,设\(f[k][i]\)表示从\(1\)到\(i\),长度为\(k\)的路径条数,则\(f[k][i] = \sum_{j=1}^n f[k - 1][j] a[j][i]\)。于是可以构造初始矩阵,再乘以\(a^k\)(\(a\)为图的邻接矩阵)。

现在边权不唯一,但是边权很小,可以拆点,一个点拆成\(9\)个点,\(9\)点连成一条链,如果要连出边就从最后一个点连出去,如果连入边就连到相应到点就好。

注意模数比较小,取模可以少一些,会跑的比较快

#include <algorithm>
#include <cstdio>
using namespace std; const int N = 12;
const int M = 92;
const int mo = 2009; struct matrix {
int a[M][M], n, m;
matrix operator *(const matrix & b) {
matrix ans; ans.n = n; ans.m = b.m;
for(int i = 1; i <= ans.n; i ++) {
for(int j = 1; j <= ans.m; j ++) {
ans.a[i][j] = 0;
for(int k = 1; k <= m; k ++)
ans.a[i][j] += a[i][k] * b.a[k][j];
ans.a[i][j] %= mo;
}
}
return ans;
}
friend matrix mpow(matrix a, int b) {
matrix ans = a; b --;
for(; b >= 1; b >>= 1, a = a * a)
if(b & 1) ans = ans * a;
return ans;
}
} fir, tr; int n, m, d;
char s[N]; int pos(int x, int y = 8) {
return x + y * n;
} int main() {
scanf("%d%d", &n, &d);
tr.n = tr.m = m = n * 9;
for(int i = 1; i <= m; i ++)
for(int j = 1; j <= m; j ++)
tr.a[i][j] = 0;
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= 8; j ++)
tr.a[pos(i, j - 1)][pos(i, j)] = 1;
scanf("%s", s + 1);
for(int j = 1; j <= n; j ++) {
int w = s[j] ^ '0';
if(w) tr.a[pos(i)][pos(j, 9 - w)] = 1;
}
}
fir.n = 1; fir.m = m;
for(int i = 1; i <= fir.m; i ++)
fir.a[1][i] = i == pos(1) ? 1 : 0;
fir = fir * mpow(tr, d);
printf("%d\n", fir.a[1][pos(n)]);
return 0;
}

「BZOJ 1297」「SCOI 2009」迷路「矩阵乘法」的更多相关文章

  1. 1297. [SCOI2009]迷路【矩阵乘法】

    Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...

  2. BZOJ 4417 Luogu P3990 [SHOI2013]超级跳马 (DP、矩阵乘法)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4417 (luogu)https://www.luogu.org/prob ...

  3. BZOJ 2004: [Hnoi2010]Bus 公交线路 [DP 状压 矩阵乘法]

    传送门 题意: $n$个公交站点,$k$辆车,$1...k$是起始站,$n-k+1..n$是终点站 每个站只能被一辆车停靠一次 每辆车相邻两个停靠位置不能超过$p$ 求方案数 $n \le 10^9, ...

  4. 【BZOJ 4180】 4180: 字符串计数 (SAM+二分+矩阵乘法)

    4180: 字符串计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 164  Solved: 75 Description SD有一名神犇叫做Oxe ...

  5. bzoj 1706: [usaco2007 Nov]relays 奶牛接力跑【矩阵乘法+Floyd】

    唔不知道怎么说--大概核心是把矩阵快速幂的乘法部分变成了Floyd一样的东西,非常之神 首先把点离散一下,最多有200个,然后建立邻接矩阵,a[u][v]为(u,v)之间的距离,没路就是inf 然后注 ...

  6. 「BZOJ 4228」Tibbar的后花园

    「BZOJ 4228」Tibbar的后花园 Please contact lydsy2012@163.com! 警告 解题思路 可以证明最终的图中所有点的度数都 \(< 3\) ,且不存在环长是 ...

  7. 「BZOJ 3645」小朋友与二叉树

    「BZOJ 3645」小朋友与二叉树 解题思路 令 \(G(x)\) 为关于可选大小集合的生成函数,即 \[ G(x)=\sum[i\in c ] x^i \] 令 \(F(x)\) 第 \(n\) ...

  8. 「BZOJ 4502」串

    「BZOJ 4502」串 题目描述 兔子们在玩字符串的游戏.首先,它们拿出了一个字符串集合 \(S\),然后它们定义一个字符串为"好"的,当且仅当它可以被分成非空的两段,其中每一段 ...

  9. 「BZOJ 4289」 PA2012 Tax

    「BZOJ 4289」 PA2012 Tax 题目描述 给出一个 \(N\) 个点 \(M\) 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 \(1\) 到点 \( ...

随机推荐

  1. java代码从键盘输入执行次数,数,然后排序

    总结:实现从键盘控制执行次数,困惑我很久,直到昨日在提问时,网友说通过循环是肯定可以的所以顿悟了 package com.c2; import java.util.Arrays; import jav ...

  2. java代码随机数100个,10个一输出显示======

    总结:空格???懂否?如何显示 for(int i=0;i<100;i++){ if(i%10==0){ System.out.println(); } System.out.print(n[i ...

  3. 人脸识别FaceNet+TensorFlow

    一.本文目标 利用facenet源码实现从摄像头读取视频,实时检测并识别视频中的人脸.换句话说:把facenet源码中contributed目录下的real_time_face_recognition ...

  4. namenode和datanode机制

    转自:https://www.cnblogs.com/DarrenChan/p/6416043.html?utm_source=itdadao&utm_medium=referral 首先我们 ...

  5. docker 笔记(4) Dockerfile 常用的指令

    下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档. FROM指定 base 镜像. MAINTAINER设置镜像的作者,可以是任意字符串. COPY将文件从 build ...

  6. Java的JAR包, EAR包 ,WAR包 都是干什么的,有什么区别

    JAR包:打成JAR包的代码,一般作为工具类,在项目中,会应用到N多JAR工具包: WAR包:JAVA WEB工程,都是打成WAR包,进行发布,如果我们的服务器选择TOMCAT等轻量级服务器,一般就打 ...

  7. oracle --(一)数据块(data Block)

    基本关系:数据库---表空间---数据段---分区---数据块 数据块(data Block)一.数据块Block是Oracle存储数据信息的最小单位.这里说的是Oracle环境下的最小单位.Orac ...

  8. CSS布局奇淫巧计之-强大的负边距

    css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果.很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同学来说,那是必须的. ...

  9. IE的haslayout

    haslayout 是Windows Internet Explorer渲染引擎的一个内部组成部分.在InternetExplorer中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元 ...

  10. centos 端口iptables配置

    1.安装iptables yum install iptables* -y 2.打开端口 iptables -I INPUT -p tcp --dport -j ACCEPT 3.查看本机关于IPTA ...