Educational DP Contest R - Walk(倍增floyd,矩阵快速幂)
题目来源:AtCoder EDU DP题集
题目链接:Here
单独拎出来是因为这道题是一个很好的板子,值得记录
题意
给定一个 n 个节点的有向图的邻接矩阵,求该有向图中长度为 k 的路径长。
解法
算法涉及:倍增 Floyd
答案为该邻接矩阵的 \(k\) 次幂的行列式。
学过离散数学的后面图论的话大概都知道求有向图中长度为 \(k\) 的路径长的路径与原始图的 \(k\) 次方相关,所以只需要求原矩阵的 \(k\) 次幂即可
使用矩阵快速幂即可,时间复杂度 \(\mathcal{O}(n^2log k)\)
const int mod = 1e9 + 7;
ll n, k;
struct Matrix {
ll mat[50][50];
void clear() {memset(mat, 0, sizeof(mat));}
void reset(int n) {
clear();
for (int i = 0; i < n; ++i) mat[i][i] = 1;
}
} a;
Matrix MatrixMul(Matrix a, Matrix b) { // 矩阵快速乘
Matrix t; t.clear();
for (int i = 0; i < n; ++i)
for (int k = 0; k < n; ++k)
for (int j = 0; j < n; ++j)
t.mat[i][j] = (t.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % mod;
return t;
}
ll MatrixQpow(Matrix a, ll p) { // 矩阵快速幂
Matrix s; s.reset(n);
for (; p; p >>= 1, a = MatrixMul(a, a))
if (p & 1) s = MatrixMul(s, a);
ll sum = 0;
for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j)
sum = (sum + s.mat[i][j]) % mod;
return sum;
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> k;
for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) cin >> a.mat[i][j];
cout << MatrixQpow(a, k);
}
Educational DP Contest R - Walk(倍增floyd,矩阵快速幂)的更多相关文章
- CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)
问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...
- [POJ3613] Cow Relays(Floyd+矩阵快速幂)
解题报告 感觉这道题gyz大佬以前好像讲过一道差不多的?然鹅我这个蒟蒻发现矩阵快速幂已经全被我还给老师了...又恶补了一遍,真是恶臭啊. 题意 给定一个T(2 <= T <= 100)条边 ...
- poj 3613 经过k条边最短路 floyd+矩阵快速幂
http://poj.org/problem?id=3613 s->t上经过k条边的最短路 先把1000范围的点离散化到200中,然后使用最短路可以使用floyd,由于求的是经过k条路的最短路, ...
- POJ 3631 Cow Relays Floyd+矩阵快速幂
题目描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...
- foj 2173 floyd+矩阵快速幂
Problem 2173 Nostop Accept: 52 Submit: 210 Time Limit: 3000 mSec Memory Limit : 32768 KB Pro ...
- POJ 3613 floyd+矩阵快速幂
题意: 求s到e恰好经过n边的最短路 思路: 这题已经被我放了好长时间了. 原来是不会矩阵乘法,快速幂什么的也一知半解 现在终于稍微明白了点了 其实就是把矩阵乘法稍微改改 改成能够满足结合律的矩阵&q ...
- UVA11149 Power of Matrix —— 矩阵倍增、矩阵快速幂
题目链接:https://vjudge.net/problem/UVA-11149 题意: 给出矩阵A,求出A^1 + A^2 …… + A^k . 题解: 1.可知:A^1 + A^2 …… + A ...
- poj 3420 Quad Tiling (状压dp+多米诺骨牌问题+矩阵快速幂)
还有这种操作?????? 直接用pre到now转移的方式构造一个矩阵就好了. 二进制长度为m,就构造一个长度为1 << m的矩阵 最后输出ans[(1 << m) - 1][( ...
- fzu 2173 floyd+矩阵快速幂
#include<stdio.h> #define inf 1000000000000000 #define N 100 long long tmp[N][N],ma[N][N]; int ...
- bnuoj 34985 Elegant String DP+矩阵快速幂
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...
随机推荐
- 关于微信小程序中如何实现数据可视化-echarts动态渲染
移动端设备中,难免会涉及到数据的可视化展示.数据统计等等,本篇主要讲解原生微信小程序中嵌入echarts并进行动态渲染,实现数据可视化功能. 基础使用 首先在GitHub上下载echarts包 地址: ...
- [CF1748D] ConstructOR
题目描述 You are given three integers $ a $ , $ b $ , and $ d $ . Your task is to find any integer $ x $ ...
- [USACO2007FEB S]Silver Lilypad Pond
题目描述 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成 了M行N列个方格(1 ≤ M, N ≤ 30).一些格子是坚固得令人惊讶的莲花,还有一些格子是 岩石,其余的只是 ...
- GKCTF2020WP-Crypto Misc
Crypto 小学生的密码学 题目 e(x)=11x+6(mod26) 密文:welcylk (flag为base64形式) 我的解答: 考点:仿射密码,已知a,b 结果base64加密即可 flag ...
- PTA数组及排序查找题解与解题思路
PTA数组及排序查找题解与解题思路 函数题目 函数题目为平台提供的裁判程序调用所完成的函数进行判题,题目规定语言为C语言 6-1 求出二维数组的最大元素及其所在的坐标 本题较为简单,考察的是如何遍历一 ...
- Python 实现HTML 转Word
之前文章分享过如何使用Spire.Doc for Python库将Word文档转为HTML格式,反过来,该库也能实现HTML到Word文档的转换.通过代码进行转换,避免了手动复制粘贴费时间,并且可能会 ...
- MySQL|MySQL事物以及隔离级别
MySQL 事务主要用于处理操作量大,复杂度高的数据.比如开单,需要添加给订单表增加记录,还需要增加订单的各种相关明细,操作复杂度高,这些操作语句需要构成一个事务.在 MySQL 命令行的默认设置下, ...
- P7112 【模板】行列式求值
学<高等代数>第二章的时候过来搜了搜模板,结果真搜到了.于是水一篇题解. 本文部分内容来自<高等代数>. 行列式定义 对于一个 \(n\) 阶行列式 \[A_{n \times ...
- Numpy计算近邻表时间对比
技术背景 所谓的近邻表求解,就是给定N个原子的体系,找出满足cutoff要求的每一对原子.在前面的几篇博客中,我们分别介绍过CUDA近邻表计算与JAX-MD关于格点法求解近邻表的实现.虽然我们从理论上 ...
- HDU 6203 ping ping ping 最近公共祖先 树状数组
原题链接 题意 给我们一棵n+1节点,n条边的树,然后给我们p条路径(每条路径给出两个端点).我们需要从树上选出一些点,使得每条路径都至少包含我们选出的一个点.求最少选多少点. 思路 以1为根,我们可 ...