BZOJ 1875 HH去散步(矩阵快速幂)
题意:
给定一张无向图,每条路的长度都是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去散步(矩阵快速幂)的更多相关文章
- 【BZOJ】1875: [SDOI2009]HH去散步 矩阵快速幂
[题意]给定n个点m边的无向图,求A到B恰好经过t条边的路径数,路径须满足每条边都和前一条边不同.n<=20,m<=60,t<=2^30. [算法]矩阵快速幂 [题解]将图的邻接矩阵 ...
- bzoj1875 [SDOI2009]HH去散步 矩阵快速幂
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1875 题解 如果没有这个"不能立刻沿着刚刚走来的路走回",那么这个题就是一 ...
- bzoj1875 [SDOI2009]HH去散步——矩阵快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1875 有个限制是不能走回头路,比较麻烦: 所以把矩阵中的元素设成边的经过次数,单向边之间就好 ...
- [luogu2151 SDOI2009] HH去散步 (矩阵快速幂)
传送门 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH ...
- 【bzoj1875】【JZYZOJ1354】[SDOI2009]HH去散步 矩阵快速幂 点边转换
http://172.20.6.3/Problem_Show.asp?id=1354 http://www.lydsy.com/JudgeOnline/problem.php?id=1875 题意: ...
- bzoj 1875: [SDOI2009]HH去散步 -- 矩阵乘法
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走, ...
- 洛谷P2151 [SDOI2009] HH去散步 [矩阵加速]
题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走 ...
- BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )
矩阵快速幂...+快速乘就OK了 ----------------------------------------------------------------------------------- ...
- BZOJ 2326 数学作业(分段矩阵快速幂)
实际上,对于位数相同的连续段,可以用矩阵快速幂求出最后的ans,那么题目中一共只有18个连续段. 分段矩阵快速幂即可. #include<cstdio> #include<iostr ...
随机推荐
- 利用cross-entropy cost代替quadratic cost来获得更好的收敛
1.从方差代价函数说起(Quadratic cost) 代价函数经常用方差代价函数(即采用均方误差MSE),比如对于一个神经元(单输入单输出,sigmoid函数),定义其代价函数为: 其中y是我们期望 ...
- Java:List判空的条件:List=null 和 List.size = 0
当需要对一个LIst进行判空操作时我们可使用如下两个语句: if (list == null || list.size() == 0) {} if (list != null && l ...
- Python破解压缩包密码问题
所用知识 1. Pool 进程池 2. try...except 异常处理 3.枚举的方式 4.生成器的运用 逻辑关系 通过生成假密码去碰撞!捕获异常,一直碰撞,直到生成的密码与压缩包建立的密码对应, ...
- Selenium WebDriver(Python)API
1.通过示例介绍Selenium-WebDriver 一个简单的入门方法就是这个例子,它在Google上搜索术语“Cheese”,然后将结果页面的标题输出到控制台. java csharp pytho ...
- git基础(2)
三.查看提交历史日志查看·提交历史:git log 命令一个常用的选项是 -p,用来显示每次提交的内容差异. 你也可以加上 -2 来仅显示最近两次提交如果你想看到每次提交的简略的统计信息,你可以使用 ...
- Java and SDK 环境变量设置
File comes from http://www.cnblogs.com/shinge/p/5500002.html JAVA环境变量配置详解 JAVA环境变量JAVA_HOME.CLASSPAT ...
- 单词 (Play on Words UVA - 10129 )
题目描述: 原题:https://vjudge.net/problem/UVA-10129 题目思路: 1.明显是判断欧拉路径 2.欧拉路径的两个条件 a.图连通 b.至多为两个奇点,且一个为起点一个 ...
- PHP计算两个已知经纬度之间的距离
/** *求两个已知经纬度之间的距离,单位为千米 *@param lng1,lng2 经度 *@param lat1,lat2 纬度 *@return float 距离,单位千米 **/ privat ...
- ionic 组件学习
利用css列表多选框: <div class="{{Conceal}}" > <ion-checkbox color="secondary" ...
- synchronized 详细解说
转自 http://blog.csdn.net/javazejian/article/details/72828483 出自[zejian的博客] 写的很详细很好,做下记录 本篇主要是对Java并发 ...