BZOJ 1875

矩阵乘法加速递推。

如果不要求不能走同一条边,那么直接构造出矩阵快速幂即可,但是不走相同的道路,怎么办?

发现边数$m$也很小,我们直接把$2 * m$开成一个矩阵,相当于记录上一条边走过了编号为$j$的边的方案总数,这样子我们在构造转移矩阵的时候就可以不用计算往回走带来的贡献了。

时间复杂度$O(m^3log(MaxInt))$。

Code:

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll; const int N = ;
const int M = ;
const int P = ; int n, m, tot = , from[M], to[M]; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} template <typename T>
inline void inc(T &x, T y) {
x += y;
if(x >= P) x -= P;
} struct Matrix {
int len, wid, s[M][M]; inline void init() {
len = wid = ;
memset(s, 0LL, sizeof(s));
} friend Matrix operator * (const Matrix &x, const Matrix &y) {
Matrix res; res.init();
res.len = x.len, res.wid = y.wid;
for(int k = ; k < x.wid; k++)
for(int i = ; i < x.len; i++)
for(int j = ; j < y.wid; j++)
inc(res.s[i][j], (int) (1LL * x.s[i][k] * y.s[k][j] % P));
return res;
} } f, tra; inline Matrix fpow(Matrix x, int y) {
Matrix res; res.init();
res.len = x.len, res.wid = x.wid;
for(int i = ; i < res.len; i++) res.s[i][i] = ; for(; y > ; y >>= ) {
if(y & ) res = res * x;
x = x * x;
} return res;
} inline int opp(int now) {
return (now & ) ? now + : now - ;
} int main() {
int tim, st, ed;
read(n), read(m), read(tim), read(st), read(ed);
for(int x, y, i = ; i <= m; i++) {
read(x), read(y);
++tot, from[tot] = x, to[tot] = y;
++tot, from[tot] = y, to[tot] = x;
} f.init();f.len = , f.wid = * m;
for(int i = ; i <= tot; i++)
if(from[i] == st) ++f.s[][i - ];
tra.init(); tra.len = tra.wid = * m;
for(int i = ; i <= tot; i++)
for(int j = ; j <= tot; j++) {
if(j == i || j == opp(i)) continue;
if(to[i] == from[j])
++tra.s[i - ][j - ];
} tra = fpow(tra, tim - );
f = f * tra; int ans = ;
for(int i = ; i <= tot; i++)
if(to[i] == ed) inc(ans, f.s[][i - ]); printf("%d\n", ans);
return ;
}

Luogu 2151 [SDOI2009]HH去散步的更多相关文章

  1. Luogu P2151 [SDOI2009]HH去散步 矩乘加速DP

    思路:矩乘优化DP 提交:3次(用了一个奇怪的东西导致常数过大) 题解: 如果可以走完正向边后又走反向边那就显然了,但是不能走,所以我们要将正反向边分别编号,区分正反向边. 所以这道题的矩阵是以边的编 ...

  2. 洛谷2151[SDOI2009]HH去散步(dp+矩阵乘法优化)

    一道良好的矩阵乘法优化\(dp\)的题. 首先,一个比较\(naive\)的想法. 我们定义\(dp[i][j]\)表示已经走了\(i\)步,当前在点\(j\)的方案数. 由于题目中限制了不能立即走之 ...

  3. bzoj1875: [SDOI2009]HH去散步

    终于A了...早上按自己以前的写法一直WA.下午换了一种写法就A了qwq #include<cstdio> #include<cstring> #include<iost ...

  4. BZOJ 1875: [SDOI2009]HH去散步( dp + 矩阵快速幂 )

    把双向边拆成2条单向边, 用边来转移...然后矩阵乘法+快速幂优化 ------------------------------------------------------------------ ...

  5. BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法

    BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时H ...

  6. bzoj 1875: [SDOI2009]HH去散步 -- 矩阵乘法

    1875: [SDOI2009]HH去散步 Time Limit: 20 Sec  Memory Limit: 64 MB Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走, ...

  7. AC日记——[SDOI2009]HH去散步 洛谷 P2151

    [SDOI2009]HH去散步 思路: 矩阵快速幂递推(类似弗洛伊德): 给大佬跪烂-- 代码: #include <bits/stdc++.h> using namespace std; ...

  8. 「 洛谷 」P2151 [SDOI2009]HH去散步

    小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...

  9. 洛谷P2151 [SDOI2009] HH去散步 [矩阵加速]

    题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走 ...

随机推荐

  1. KVM-环境安装

    1.操作系统安装 本文采用Centos6.4X64操作系统,也可以采用RHEL/CentOS6.x. (1)查看系统版本.内核版本 ##查看系统版本 [root@KVM ~]# cat /etc/re ...

  2. dirent.h

    #include <dirent.h> 是POSIX.1标准定义的unix类目录操作的头文件,包含了许多UNIX系统服务的函数原型,例如opendir函数.readdir函数. opend ...

  3. WordPress发布文章前强制要求上传特色图像

    如果你的网站需要给每篇文章设置特色图像才能达到理想的显示效果,而且允许其他用户在后台发布文章的,那么您可能需要强制要求他们给文章上传特色图像,否者就无法发布.Require Featured Imag ...

  4. enumerate 枚举

  5. 【LeetCode】002 Add Two Numbers

    题目: You are given two non-empty linked lists representing two non-negative integers. The digits are ...

  6. 系列文章--C#即时通讯开发

    对使用UDP协议和大规模即时通讯的思考   C#[Fox即时通讯核心] 开发记录之五 (客户端界面基窗体基本完成)  C#[Fox即时通讯核心] 开发记录之四(服务端多线程异步处理数据 主程序大致结构 ...

  7. js易犯错误与易混淆的重要知识点

    一:作用域的问题 简单案例1: var a = 1; var n = function () { console.log(a); var a=2; } n(); =>输出undefined原因: ...

  8. 基于springboot+kotlin+gradle构建的框架的坑

    项目采用以上技术构建,于是本人就尝试构建自己的脚手架,然后遇到一大推问题. 使用的是springinitials构建,IDE是:IDEA 现在也是知其然不知其所以然,但是先记录下来修改过程,以后等知识 ...

  9. 运行flask程序

    Command Line Interface Installing Flask installs the flask script, a Click command line interface, i ...

  10. ABP 学习系列 - 目录

    一.ABP 学习系列 - 入门介绍之单表 http://www.cnblogs.com/yabu007/p/8067694.html 二.ABP 学习系列 - 入门介绍之多表 http://www.c ...