sdoi 2009 HH去散步 矩阵乘
如果没有题里的“不会立刻沿着刚刚走来的路走回”限制,那么直接矩乘计算k步的方案数
但加了这个限制,就不能以点来矩乘了,考虑边数<=60,如果以边建邻接矩阵呢??
先拆边,再把每一个边和以其终点为起点的边相连,注意不能是拆前的同一条边。
然后矩阵乘喽。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 45989
using namespace std;
int a[122][122],b[122],c[122][122],d[122];
int ans,n,m,t,S,T;
bool bo;
int e=1,head[22];
struct edge{
int u,v,next;
}ed[122];
void add(int u,int v){
ed[e].u=u; ed[e].v=v;
ed[e].next=head[u];
head[u]=e++;
}
void work(int A[122][122],int B[122][122],int C[122][122]){
int D[122][122];
for(int i=1;i<=2*m;i++)
for(int j=1;j<=2*m;j++){
D[i][j]=0;
for(int k=1;k<=2*m;k++)
D[i][j]=(D[i][j]+(A[i][k]*B[k][j])%mod)%mod;
}
for(int i=1;i<=2*m;i++)
for(int j=1;j<=2*m;j++)
C[i][j]=D[i][j];
}
int main()
{
int u,v;
scanf("%d%d%d%d%d",&n,&m,&t,&S,&T); S++; T++;
for(int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
u++; v++;
add(u,v); add(v,u);
}
for(int i=1;i<=2*m;i++)
for(int j=1;j<=2*m;j++){
if(ed[i].v==ed[j].u)
a[i][j]=1;
}
for(int i=1;i<=2*m;i+=2) a[i][i+1]=a[i+1][i]=0;
for(int i=1;i<=2*m;i++) c[i][i]=1; for(int i=head[S];i;i=ed[i].next) b[i]=1;
t--; while(t){
if(t&1) work(a,c,c);
work(a,a,a);
t>>=1;
} for(int i=1;i<=2*m;i++)
for(int j=1;j<=2*m;j++)
d[i]=(d[i]+(b[j]*c[j][i])%mod)%mod; for(int i=1;i<=2*m;i++)
if(ed[i].v==T) ans=(ans+d[i])%mod;
printf("%d\n",ans);
return 0;
}
sdoi 2009 HH去散步 矩阵乘的更多相关文章
- [BZOJ 1875] [SDOI 2009] HH去散步【矩阵乘法】
题目链接:BZOJ - 1875 题目分析: 这道题如果去掉“不会立刻沿着刚刚走来的路走回”的限制,直接用邻接矩阵跑矩阵乘法就可以了.然而现在加了这个限制,建图的方式就要做一些改变.如果我们把每一条边 ...
- [SDOI 2009]HH去散步
Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...
- bzoj 1875: [SDOI2009]HH去散步 -- 矩阵乘法
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走, ...
- 洛谷P2151 [SDOI2009] HH去散步 [矩阵加速]
题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走 ...
- 【bzoj1875】[SDOI2009]HH去散步 矩阵乘法
题目描述 一张N个点M条边的无向图,从A走到B,要求:每一次不能立刻沿着上一次的边的反方向返回.求方案数. 输入 第一行:五个整数N,M,t,A,B. N表示学校里的路口的个数 M表示学校里的路的条数 ...
- BZOJ1875 [SDOI2009]HH去散步 矩阵
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1875 题意概括 在一个无向图(有重边无自环)中走,不能在经过连续经过某一条边2次. 现在走t步,问 ...
- [luogu2151 SDOI2009] HH去散步 (矩阵快速幂)
传送门 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH ...
- [SDOI2009] HH去散步 (矩阵乘法)
link $solution:$ 将边化为点后重新建矩阵,跑$T-1$幂即可(因为跑的是新边). 最后直接找与$x,y$所相连的边即可. #include<iostream> #inclu ...
- 【BZOJ】1875: [SDOI2009]HH去散步 矩阵快速幂
[题意]给定n个点m边的无向图,求A到B恰好经过t条边的路径数,路径须满足每条边都和前一条边不同.n<=20,m<=60,t<=2^30. [算法]矩阵快速幂 [题解]将图的邻接矩阵 ...
随机推荐
- 使用 focus() 和 blur()
<html> <head> <style type="text/css"> a:active {color:green} </style& ...
- Form 和 Input 对象
更改表单的 action 属性 <html> <head> <script type="text/javascript"> function c ...
- 【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象
不完整的抽象 抽象未支持所有互补或相关的方法时,将导致这种坏味. 为什么要有完整的抽象? 一种重要的抽象实现手法是创建内聚而完整的抽象.抽象未支持相关的方法时,可能会影响抽象的内聚性和完整性.如果抽象 ...
- Java编程语言下Selenium 利用Robot自己编写截屏方法
import java.awt.Robot; import java.awt.event.KeyEvent; import java.util.concurrent.TimeUnit; import ...
- Golang之Context的使用
转载自:http://www.nljb.net/default/Golang%E4%B9%8BContext%E7%9A%84%E4%BD%BF%E7%94%A8/ 简介 在golang中的创建一个新 ...
- Ocelot中文文档-中间件注入和重写
警告!请谨慎使用. 如果您在中间件管道中看到任何异常或奇怪的行为,并且正在使用以下任何一种行为.删除它们,然后重试! 当在Startup.cs中配置Ocelot的时候,可以添加或覆盖中间件.如下所示: ...
- Hi,这有一份风控体系建设干货
互联网.移动互联网.云计算.大数据.人工智能.物联网.区块链等技术已经在人类经济生活中扮演越来越重要的角色,技术给人类带来各种便利的同时,很多企业也饱受"硬币"另一面的伤害,并且形 ...
- WebApiClient库支持AOT
1 库简介 WebApiClient是开源在github上的一个http客户端库,内部基于HttpClient开发,只需要定义c#接口(interface),并打上相关特性,即可异步调用http-ap ...
- webpack4:连奏中的进化
webpack4在2月底的时候发布,这次webpack4有了一个名字"Legato",也就是"连奏"的意思,寓意webpack在不断进化,而且是无缝(no-ga ...
- 一次数组越界的bug经历
数组和指针都是C里面的好东西,但是一旦使用不当,真的会让人抓狂. 下面是写程序时遇到的一次数组越界的经历,感觉对以后写程序有点启发,所以记录下来. 起因: 我想用OLED动态显示一组浮点数,而且浮点数 ...