HH去散步[SDOI2009]
题目描述
HH有个一成不变的习惯,喜欢饭后百步走。所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离。 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回。 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法。 现在给你学校的地图(假设每条路的长度都是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符合条件的路径
输入
输出
一行,表示答案。
样例输入
4 5 3 0 0
0 1
0 2
0 3
2 1
3 2
样例输出
4 题解
考试的时候想得比较粗略,一开始当然是暴力深搜,也知道这种方案数还取模的题不可能深搜出正解,但还是先打了一通,没费什么力气就出了样例。之后开始想正解,感觉或许应该把环收缩一下,但是环环相扣环环重叠不知道应该怎么处理,最后还是把深搜交上去了。
正解是矩阵优化dp(但总感觉它其实说不上是dp),比如矩阵G[i,j]的k次方中的g(a,b)可以表示从a点到b点经过k条边的方案数,本题因为对于边有特殊的要求(不立刻反向)所以把边放进矩阵,G[i,j]为1表示从i到j有一条边,这里的边是分方向的,双向建边就会有2*m条。tot矩阵(其实只有一行)表示从起点有哪些边出来。tot乘上G[i,j]的k-1次方(注意顺序,矩阵乘法不满足交换律),把得到的一行结果矩阵中有边到终点的位加和,得到的结果即为答案。
刚开始觉得矩阵非常抽象,虽然自己在课下学过很多数学书上的理论知识但还是不会用,不过这道题让我明白矩阵也是有明确含义的(加速矩阵除外),本质上还是要理解算法每一步的目的。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,t,a,b,temp;
const int md=;
int dis[][]={},tot[][]={},ans[][]={};
inline int r()
{
int jg=,jk=;
jk=getchar()-'';
if(jk>=&&jk<=) jg+=jk;
jk=getchar()-'';
while(jk>=&&jk<=)
{
jg*=;
jg+=jk;
jk=getchar()-'';
}
return jg;
}
int h[],e;
struct B
{
int u,v,ne;
}bi[];
void add(int x,int y)
{
bi[e].u=x;
bi[e].v=y;
bi[e].ne=h[x];
h[x]=e++;
}
int jg[][];
void jc(int cs1[][],int cs2[][])
{
memset(jg,,sizeof(jg));
for(int i=;i<temp;i++)
for(int j=;j<temp;j++)
for(int k=;k<temp;k++)
jg[i][j]+=(cs1[i][k]*cs2[k][j])%md;
for(int i=;i<temp;i++)
for(int j=;j<temp;j++)
cs1[i][j]=jg[i][j]%md;
}
void init()
{
n=r();
m=r();
t=r();
a=r();
b=r();
temp=*m;
memset(h,-,sizeof(h));
int a1,a2;
for(int i=;i<m;i++)
{
a1=r();
a2=r();
add(a1,a2);
add(a2,a1);
}
for(int i=;i<n;i++)
for(int j=h[i];j!=-;j=bi[j].ne)
for(int k=h[bi[j].v];k!=-;k=bi[k].ne)
{
if(((k&)&&k==j+)||((j&)&&j==k+))
continue;
dis[j][k]=;
}
for(int i=h[a];i!=-;i=bi[i].ne)
tot[][i]=;
}
int main()
{
init();
for(int i=;i<temp;i++)
ans[i][i]=;
t--;
while(t)
{
if(t&) jc(ans,dis);
t>>=;
jc(dis,dis);
}
jc(tot,ans);
int res=;
for(int i=h[b];i!=-;i=bi[i].ne)
{
if(i&)
res+=tot[][i-];
else
res+=tot[][i+];
}
printf("%d",res%md);
return ;
}
HH去散步[SDOI2009]的更多相关文章
- bzoj1875: [SDOI2009]HH去散步
终于A了...早上按自己以前的写法一直WA.下午换了一种写法就A了qwq #include<cstdio> #include<cstring> #include<iost ...
- BZOJ 1875: [SDOI2009]HH去散步( dp + 矩阵快速幂 )
把双向边拆成2条单向边, 用边来转移...然后矩阵乘法+快速幂优化 ------------------------------------------------------------------ ...
- BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法
BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时H ...
- bzoj 1875: [SDOI2009]HH去散步 -- 矩阵乘法
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走, ...
- AC日记——[SDOI2009]HH去散步 洛谷 P2151
[SDOI2009]HH去散步 思路: 矩阵快速幂递推(类似弗洛伊德): 给大佬跪烂-- 代码: #include <bits/stdc++.h> using namespace std; ...
- 【bzoj1875】【SDOI2009】【HH去散步】
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 932 Solved: 424 [Submit][Status ...
- 「 洛谷 」P2151 [SDOI2009]HH去散步
小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...
- BZOJ 1875 【SDOI2009】 HH去散步
题目链接:HH去散步 如果不考虑不能走上一次走的边的话,这道题就是一个矩乘的裸题. 现在有了这个条件其实也很好做.我们平常的矩阵都是按点建的,\(A_{i,j}\)表示从第\(i\)个点走到第\(j\ ...
- 洛谷P2151 [SDOI2009] HH去散步 [矩阵加速]
题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走 ...
随机推荐
- 抓包工具 - Fiddler(如何捕获Android数据包)
如何捕获Android数据包 一.移动设备访问网络原理 先看看移动设备是怎么去访问网络,如图1所示,可以看到,移动端的数据包是从wifi出去的. 图1(移动设备访问网络) 所以我们可以把自己的电脑开启 ...
- strval
将变量转成字符串类型. 语法: string strval(mixed var); 返回值: 字符串 函数种类: PHP 系统功能 内容说明 本函数可将数组及类之外的变量类型转换成字符串类型. ...
- Linux系统介绍
类似Windows, Linux也是一个操作系统,Linux是一套开放源代码程序,并可以自由传播的类Unix操作系统软件,多用户,多任务并且支持多线程和多CPU的操作系统. Linux系统主要被应用于 ...
- 在ASP.NET Core配置环境变量和启动设置
在这一部分内容中,我们来讨论ASP.NET Core中的一个新功能:环境变量和启动设置,它将开发过程中的调试和测试变的更加简单.我们只需要简单的修改配置文件,就可以实现开发.预演.生产环境的切换. A ...
- Ion-affix & Ion-stick 仿IOS悬浮列表插件
Ion-affix & Ion-stick 仿IOS悬浮列表插件 Ion-affix 1.相关网页 Ion-affix 2.环境准备: 执行命令 bower install ion-affix ...
- vijos1047题解
总算编好了这一题,我表示200+行,亚历山大. 题目描述很简单,做起来不简单啊.(高精度的取模和除法不是一般的恶心!) 先说一下非高精度的一般做法. 求两个数a,b的最小公倍数,就是a.b的乘积与a. ...
- 跟我一起读postgresql源码(六)——Executor(查询执行模块之——查询执行策略)
时光荏苒,岁月如梭.楼主已经很久没有更新了.之前说好的一周一更的没有做到.实在是事出有因,没能静下心来好好看代码.当然这不能作为我不更新的理由,时间挤挤还是有的,拖了这么久,该再写点东西了,不然人就怠 ...
- JavaWeb 后端 <二> 之 Servlet 学习笔记
一.Servlet概述 1.什么是Servlet Servlet是一个运行在服务器端的Java小程序,通过HTTP协议用于接收来自客户端请求,并发出响应. 2.Servlet中的方法 public v ...
- JS - JSON.stringify
- php 批量进行复制文件
php 批量进行复制文件 1.前言 目标:php批量进行复制指定的目录文件夹下所有文件复制到另一个文件夹下 所使用的的php函数:is_dir,opendir,readdir,scandir,mkdi ...