BZOJ1875 [SDOI2009]HH去散步 矩阵
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1875
题意概括
在一个无向图(有重边无自环)中走,不能在经过连续经过某一条边2次。
现在走t步,问有多少中从A到B的方案。
答案mod 45989
点数<=20,边数<=60,t<=230
题解
一开始没看到不能来回走这一个条件,所以还以为是一道水题。
发现这个之后,思考一下,发现还是一道水题。
如果没有这个限制条件,那么我们按照点构建矩阵,用快速幂优化就可以了。
但是有了这个之后就稍微难一些。
我们发现边数很少,所以我们从边开始考虑。
我们发现可以按照边构建矩阵,表示从某条边到某条边的方案数。
这样可以避免来回。
边数=60*2=120,1203*log(230)可以过去的。
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=20+5,M=60*2+5,mod=45989;
int n,m,t,A,B;
struct Gragh{
int cnt,x[M],y[M],nxt[M],fst[N];
void set(){
cnt=0;
memset(fst,0,sizeof fst);
}
void add(int a,int b){
x[++cnt]=a,y[cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt;
}
}g;
struct Mat{
int v[M][M];
void set(int x){
memset(v,0,sizeof v);
if (x!=1)
return;
for (int i=1;i<=m;i++)
v[i][i]=1;
}
Mat operator * (Mat x){
Mat ans;
ans.set(0);
for (int i=1;i<=m;i++)
for (int j=1;j<=m;j++)
for (int k=1;k<=m;k++)
ans.v[i][j]=(ans.v[i][j]+v[i][k]*x.v[k][j])%mod;
return ans;
}
}M0,M1,M2,M3;
Mat MatPow(Mat x,int y){
Mat ans,now=x;
ans.set(1);
while (y){
if (y&1)
ans=ans*now;
now=now*now;
y>>=1;
}
return ans;
}
int op(int x){
if (x%2==0)
return x-1;
return x+1;
}
int main(){
scanf("%d%d%d%d%d",&n,&m,&t,&A,&B);
g.set();
for (int i=1,a,b;i<=m;i++){
scanf("%d%d",&a,&b);
g.add(a,b),g.add(b,a);
}
m<<=1;
M0.set(0);
for (int i=1;i<=m;i++){
for (int j=g.fst[g.y[i]];j;j=g.nxt[j])
if (j!=op(i))
M0.v[i][j]++;
}
M1.set(0);
for (int i=g.fst[A];i;i=g.nxt[i])
M1.v[1][i]++;
M2=MatPow(M0,t-1);
M3=M1*M2;
int ans=0;
for (int i=1;i<=m;i++)
if (g.y[i]==B)
ans=(ans+M3.v[1][i])%mod;
printf("%d",ans);
return 0;
}
BZOJ1875 [SDOI2009]HH去散步 矩阵的更多相关文章
- bzoj1875 [SDOI2009]HH去散步——矩阵快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1875 有个限制是不能走回头路,比较麻烦: 所以把矩阵中的元素设成边的经过次数,单向边之间就好 ...
- bzoj1875 [SDOI2009]HH去散步 矩阵快速幂
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1875 题解 如果没有这个"不能立刻沿着刚刚走来的路走回",那么这个题就是一 ...
- 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 ...
- 洛谷P2151 [SDOI2009] HH去散步 [矩阵加速]
题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走 ...
- 【bzoj1875】[SDOI2009]HH去散步 矩阵乘法
题目描述 一张N个点M条边的无向图,从A走到B,要求:每一次不能立刻沿着上一次的边的反方向返回.求方案数. 输入 第一行:五个整数N,M,t,A,B. N表示学校里的路口的个数 M表示学校里的路的条数 ...
- 【题解】 bzoj1875: [SDOI2009]HH去散步 (动态规划+矩阵乘法)
bzoj1875,懒得复制,戳我戳我 Solution: 看到这道题,看的出是个dp,每个点\(t\)时刻到达的方案数等于\(t-1\)到连过来的点方案数之和 但又因为题目有要求不能走一样的边回去不是 ...
- BZOJ1875 [SDOI2009]HH去散步 【dp + 矩阵优化】
题目 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变 ...
- [bzoj1875][SDOI2009] HH去散步 [dp+矩阵快速幂]
题面 传送门 正文 其实就是让你求有多少条长度为t的路径,但是有一个特殊条件:不能走过一条边以后又立刻反着走一次(如果两次经过同意条边中间隔了别的边是可以的) 如果没有这个特殊条件,我们很容易想到dp ...
随机推荐
- DotNetBar ItemPanel添加WinForm Control
int itemcount = 20; Random rd = new Random(); itemPanel1.Items.Clear(); for (int i = 0; i < itemc ...
- HTTP协议(下午茶)
http://www.kancloud.cn/kancloud/tealeaf-http/43840 下午茶
- js委托事件和代理事件
转载出处:https://www.cnblogs.com/liugang-vip/p/5616484.html js中的事件委托或是事件代理详解 起因: 1.这是前端面试的经典题型,要去找工作的小伙伴 ...
- MyBatis学习-入门
eclipse + jdk 1.8 + mybatis 1.数据库准备 安装mysql数据库,建立数据库test,在test库下建立测试的表 CREATE TABLE `t_user` ( `id` ...
- 上传程序Dictionary 字典 哈希--多读一写锁ReaderWriterLock
//上传程序Dictionary 字典 哈希 /// <summary> /// 车辆控制信息哈斯表,Key是终端号,Value是车辆信息控制对象 /// </summary> ...
- iOS视频流开发(1)—视频基本概念
iOS视频流开发(1)-视频基本概念 手机比PC的优势除了便携外,她最重要特点就是可以快速方便的创作多媒体作品.照片分享,语音输入,视频录制,地理位置.一个成功的手机APP从产品形态上都有这其中的一项 ...
- Android开发技巧——ViewPager加View情况封装PagerAdapter的实现类
ViewPager是Android的support库中的一个控件. ViewPager + Fragment的使用,已经有FragmentAdapter的实现可以帮助我们快速进行开发了: ViewPa ...
- 【API】API函数创建用户,添加到管理组
1 学习目标 使用API添加用户可以绕过某些杀毒软件的限制. 2 编程思路 2.1 代码原理 使用NetUserAdd这个API添加普通权限的用户,NetLocalGroupAddMembers这个A ...
- Two Sum I & II & III & IV
Two Sum I Given an array of integers, find two numbers such that they add up to a specific target nu ...
- linux /proc目录说明(访问内核数据结构,修改内核设置)
1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...