题意: 
给定一张无向图,每条路的长度都是1,没有自环,可能有重边,给定起点与终点,求从起点走t步到达终点的方案数。 
每一步走的时候要求不能走上一条刚刚走的路。 
解析: 
显然需要搞出个矩阵之后矩乘。 
然而这题的要求就很烦,要不然就是SB题了2333. 
但是我们可以换一个想法来做。 
题目要求不走上一条来的边,况且边的数量还很少,所以我们可以考虑将矩阵构造成从一条边走到另一条边的方案数。 
这样的话我们避免走上一条来的路就很简单的能判断了。 
构造出初始矩阵后,我们求该矩阵的t-1次方。 
然后再用起点走一步能到的边的矩阵乘以该矩阵。 
之后起点到链接终点的边的所有方案数之和即为答案。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define mod 45989
#define N 22
using namespace std;
int n,m,t,a,b;
struct Matrix
{
int map[N*][N*];
void clear(){memset(map,,sizeof(map));}
friend Matrix operator * (Matrix &a,Matrix &b)
{
Matrix ret;
for(int i=;i<=*m;i++)
{
for(int j=;j<=*m;j++)
{
ret.map[i][j]=;
for(int k=;k<=*m;k++)
{
ret.map[i][j]=ret.map[i][j]+a.map[i][k]*b.map[k][j]%mod;
}
ret.map[i][j]%=mod;
}
}
return ret;
}
friend Matrix operator ^ (Matrix &a,int b)
{
Matrix ret;
ret.clear();
for(int i=;i<=m*;i++)ret.map[i][i]=;
while(b)
{
if(b&)ret=ret*a;
a=a*a;
b>>=;
}
return ret;
}
}ori,base;
int head[N],cnt;
struct node
{
int from,to,next;
}edge[N*];
void init()
{
memset(head,-,sizeof(head));
cnt=;
}
void edgeadd(int from,int to)
{
edge[cnt].from=from,edge[cnt].to=to,edge[cnt].next=head[from];
head[from]=cnt++;
}
int main()
{
init();
scanf("%d%d%d%d%d",&n,&m,&t,&a,&b);
a++,b++;
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x++,y++;
edgeadd(x,y),edgeadd(y,x);
}
for(int i=head[a];i!=-;i=edge[i].next)
base.map[][i]++;
for(int i=;i<cnt;i++)
{
int x=edge[i].from,y=edge[i].to;
for(int j=head[y];j!=-;j=edge[j].next)
{
if(j!=(i+((i&)?:-)))
ori.map[i][j]++;
}
}
ori=ori^(t-);
base=base*ori;
int sum=;
for(int i=;i<cnt;i++)
{
if(edge[i].to==b)
sum=(sum+base.map[][i])%mod;
}
printf("%d\n",sum);
}

BZOJ 1875 HH去散步(矩阵快速幂)的更多相关文章

  1. 【BZOJ】1875: [SDOI2009]HH去散步 矩阵快速幂

    [题意]给定n个点m边的无向图,求A到B恰好经过t条边的路径数,路径须满足每条边都和前一条边不同.n<=20,m<=60,t<=2^30. [算法]矩阵快速幂 [题解]将图的邻接矩阵 ...

  2. bzoj1875 [SDOI2009]HH去散步 矩阵快速幂

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1875 题解 如果没有这个"不能立刻沿着刚刚走来的路走回",那么这个题就是一 ...

  3. bzoj1875 [SDOI2009]HH去散步——矩阵快速幂

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1875 有个限制是不能走回头路,比较麻烦: 所以把矩阵中的元素设成边的经过次数,单向边之间就好 ...

  4. [luogu2151 SDOI2009] HH去散步 (矩阵快速幂)

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

  5. 【bzoj1875】【JZYZOJ1354】[SDOI2009]HH去散步 矩阵快速幂 点边转换

    http://172.20.6.3/Problem_Show.asp?id=1354 http://www.lydsy.com/JudgeOnline/problem.php?id=1875  题意: ...

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

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

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

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

  8. BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )

    矩阵快速幂...+快速乘就OK了 ----------------------------------------------------------------------------------- ...

  9. BZOJ 2326 数学作业(分段矩阵快速幂)

    实际上,对于位数相同的连续段,可以用矩阵快速幂求出最后的ans,那么题目中一共只有18个连续段. 分段矩阵快速幂即可. #include<cstdio> #include<iostr ...

随机推荐

  1. DevExpress TreeList用法总结

    http://blog.itpub.net/29251214/viewspace-774395/ http://blog.csdn.net/czp_huster/article/details/501 ...

  2. day 10 形态学处理 膨胀

    #-*- coding:utf-8 -*- #1.导入包 import cv2 import numpy as np #2.导入图片 img = cv2.imread('home.jpg',0) #3 ...

  3. spring源码-国际化-3.5

    一.国际化在实际代码中是非常常见的一中方式.为了结合web做一下语言上面的切换,而达到展示的目的. 二.这里呢,主要是介绍spring中对于国际化做了哪些处理. 三.实现方式 1)xml配置 < ...

  4. JavaScript事件及BOM和DOM

    1. 事件 1.1 事件绑定 # 写在html元素中<button onclick="code..."></div>​# 把事件当做元素对象的方法btnEl ...

  5. Manual install on Windows 7 with Apache and MySQL

    These are instructions for installing on Windows 7 desktop (they may also be useful for a server ins ...

  6. tomcat部署项目,80端口被占,解决方案

    第一个解决方案: 最大的可能:被System占了. 解决Windows Server 2008 System进程占用80端口 输入netstat -ano 可以看到80端口被PID4占用,于是打开任务 ...

  7. spark-submit配置说明

    <Spark 官方文档>Spark配置 spark-1.6.0 原文地址 Spark配置 Spark有以下三种方式修改配置: Spark properties (Spark属性)可以控制绝 ...

  8. centos7安装zabbix3.2详解

    服务器端安装 1.安装仓库 rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noar ...

  9. matlab中设置colorbar为几种规定颜色

    我们可以通过修改colormap的值来达到这种目的. 一般来说colormap的值是64*3的矩阵,64代表64种颜色,3列是这种颜色的RGB值,不过归一化了. 如果你想将colorbar颜色设成6种 ...

  10. windows 7 安装docker

    下载docker-install.exe 下载链接 安装,一路next(安装完成后建议重启电脑) 点击桌面boot2docker Start图标,等待初始化,运行docker --version检验是 ...