Luogu P2151 [SDOI2009]HH去散步 矩乘加速DP
思路:矩乘优化DP
提交:3次(用了一个奇怪的东西导致常数过大)
题解:
如果可以走完正向边后又走反向边那就显然了,但是不能走,所以我们要将正反向边分别编号,区分正反向边。
所以这道题的矩阵是以边的编号(边的邻接矩阵),而非点来DP的。
具体地,记录每个边$w_i=(u_i,v_i)$和$w_{i^1}=(v_{i^1},u_{i^1})$,注意这个有向的。
设起点为$s$,终点为$t$,我们的初始矩阵$S$是一根行向量,把所有的$w_i \ and \ u_i==s $设为$1$,表示$s$与$w_i$连通;
然后转移矩阵$a$:若$v_i==u_j \ and \ i!=j \ xor \ 1$ ,即两条边相连,但不是互为正反向边,则在边的邻接矩阵中设为$1$。
然后快速幂,并令$ans=S*a$
最后求解答案时,统计所有$ans$中$w_i \ and \ v_i==t$ 的答案,即为最终的答案。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#define R register int
using namespace std;
//你弱,有什么资格休息
#define ull unsigned long long
#define ll long long
#define pause (for(R i=1;i<=10000000000;++i))
#define In freopen("NOIPAK++.in","r",stdin)
#define Out freopen("out.out","w",stdout)
namespace Fread {
static char B[<<],*S=B,*D=B;
#ifndef JACK
#define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++)
#endif
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
if(ch==EOF) return EOF; do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
} inline bool isempty(const char& ch) {return (ch<=||ch>=);}
inline void gs(char* s) {
register char ch; while(isempty(ch=getchar()));
do *s++=ch; while(!isempty(ch=getchar()));
}
} using Fread::g; using Fread::gs; namespace Luitaryi {
const int N=,M=;
int n,m,p,S,T,cnt=-,x[N],y[N];
int a[N][N],s[][N],ans[][N],anss;
inline void mul(int a[][N],int b[][N]) { R tmp[N][N]; memset(tmp,,sizeof(tmp));
for(R i=;i<=cnt;++i) for(R k=;k<=cnt;++k) for(R j=;j<=cnt;++j)
(tmp[i][j]+=1ll*a[i][k]*b[k][j]%M)%=M;
memcpy(a,tmp,sizeof(tmp));
}
inline void qpow(int p) {
R ret[N][N]; memset(ret,,sizeof(ret));
for(R i=;i<=cnt;++i) ret[i][i]=;
for(;p;p>>=,mul(a,a)) if(p&) mul(ret,a);
memcpy(a,ret,sizeof(ret));
}
inline void main() {
n=g(),m=g(),p=g(),S=g(),T=g();
for(R i=;i<=m;++i) {
R u=g(),v=g();
x[++cnt]=u,y[cnt]=v;
x[++cnt]=v,y[cnt]=u;
} for(R i=;i<=cnt;++i) for(R j=;j<=cnt;++j) if(i!=(j^)&&y[i]==x[j]) a[i][j]+=;
for(R i=;i<=cnt;++i) if(x[i]==S) s[][i]=;
qpow(p-); for(R i=;i<=cnt;++i) for(R j=;j<=cnt;++j) (ans[][j]+=1ll*s[][i]*a[i][j]%M)%=M;
for(R i=;i<=cnt;++i) if(y[i]==T) (anss+=ans[][i])%=M; printf("%d\n",anss);
}
}
signed main() {
Luitaryi::main();
}
2019.07.20
Luogu P2151 [SDOI2009]HH去散步 矩乘加速DP的更多相关文章
- 「 洛谷 」P2151 [SDOI2009]HH去散步
小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...
- 洛谷P2151 [SDOI2009] HH去散步 [矩阵加速]
题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走 ...
- P2151 [SDOI2009]HH去散步
题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢 ...
- [bzoj1875] [洛谷P2151] [SDOI2009] HH去散步
Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...
- 洛谷 P2151 [SDOI2009]HH去散步
题目链接 思路 如果没有不能走上一条边的限制,很显然就是dp. 设f[i][j]表示到达i点走了j步的方案数,移到k点可以表示为f[k][j+1]+=f[i][j]. 如果有限制的话,可以考虑用边表示 ...
- Luogu 2151 [SDOI2009]HH去散步
BZOJ 1875 矩阵乘法加速递推. 如果不要求不能走同一条边,那么直接构造出矩阵快速幂即可,但是不走相同的道路,怎么办? 发现边数$m$也很小,我们直接把$2 * m$开成一个矩阵,相当于记录上一 ...
- AC日记——[SDOI2009]HH去散步 洛谷 P2151
[SDOI2009]HH去散步 思路: 矩阵快速幂递推(类似弗洛伊德): 给大佬跪烂-- 代码: #include <bits/stdc++.h> using namespace std; ...
- bzoj 1875: [SDOI2009]HH去散步 -- 矩阵乘法
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走, ...
- bzoj1875: [SDOI2009]HH去散步
终于A了...早上按自己以前的写法一直WA.下午换了一种写法就A了qwq #include<cstdio> #include<cstring> #include<iost ...
随机推荐
- day0~day13
day0 day1 day2 day4 day5 day7 day9 day10 day12 day13
- Scrapy各部分运行机制?Xpath为None?多层Response如何编写?搞定Scrapy的坑
前言 Scrapy那么多模块都是怎么结合的啊?明明在chrome上的xpath helper插件写好了xpath,为什么到程序就读取的是None?Scrapy可以直接写多层response么?难道必须 ...
- 串口(USART)框图的讲解
STM32 的 USART 简介 通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵 ...
- 【贪心】洛谷2019 OI春令营 - 普及组 作业
[P3817 小A的糖果 小A有N个糖果盒,第i个盒中有a[i]颗糖果. 小A每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中加起来都只有x颗或以下的糖果,至少得吃掉几颗糖. [贪 ...
- redis的安装---Linux
1.下载https://redis.io/download wget http://download.redis.io/releases/redis-4.0.14.tar.gz tar -zxvf r ...
- (二十四)JSP标签之基本标签(<jsp:标签名>)
一.常用标签 1.1 jsp中标签一共有8中,其中常用的有6中,本文将介绍这6种常用的标签. 1.2 6种标签 1. <jsp:include> <jsp:include>标签 ...
- 数据库及MySQL基础(1)
1.数据库概述 关系型数据库:面对关系,Java面向对象. ·常见数据库 Oracle(神喻):甲骨文 DB2:IBM SQL Server:微软 Sybase:赛尔斯 MySQL:甲骨文,最早是开源 ...
- 中国5级行政区域MySQL数据库库
爬取国家统计局官网的行政区域数据,包括省市县镇村5个层级,其中港澳地区的数据只有3级;台湾地区4级;包含大陆地区的邮政编码和经纬度信息. 行政划分的总体结构是: 省->市(州)->县(区) ...
- JS中的原型对象与构造器
在Javascript中:原型对象是属于构造函数的,不属于实例:实例只能共享原型对象中的属性和方法(当然也可以有自己的属性和方法,或者覆盖原型中同名的属性和方法):构造器constructor属于原型 ...
- Recastnavigation 创建 off-mesh link 的潜规则
Recastnavigation 在创建off-mesh link 时,发现有的off-mesh link 无法寻路(虽然在地图上能看到off-mesh link 的连线 在Google Grou ...