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

题意: 给定一张无向图,每条路的长度都是1,没有自环,可能有重边,给定起点与终点,求从起点走t步到达终点的方案数. 每一步走的时候要求不能走上一条刚刚走的路. 解析: 显然需要搞出个矩阵之后矩乘. 然而这题的要求就很烦,要不然就是SB题了2333. 但是我们可以换一个想法来做. 题目要求不走上一条来的边,况且边的数量还很少,所以我们可以考虑将矩阵构造成从一条边走到另一条边的方案数. 这样的话我们避免走上一条来的路就很简单的能判断了. 构造出初始矩阵后,我们求该矩阵的t-1次方. 然后再用起点走一…
[题意]给定n个点m边的无向图,求A到B恰好经过t条边的路径数,路径须满足每条边都和前一条边不同.n<=20,m<=60,t<=2^30. [算法]矩阵快速幂 [题解]将图的邻接矩阵进行矩阵快速幂就可以得到恰好经过t条边的路径数,但不能满足题目要求. 改为对原图的边进行相互连边,将经过同一个点的边两两连边,这样就是新邻接矩阵的t-1步. 为了满足题目要求,当两条边互为反向边时不连边即可. 最后乘上从A出发的边的矩阵,然后统计到达B的路径数. 复杂度O((m*2)^3 log t). #i…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1875 题解 如果没有这个"不能立刻沿着刚刚走来的路走回",那么这个题就是一个常规的矩阵乘法. 考虑一下这个限制怎么解决.因为限制的是边,我们不妨考虑和边有关的矩阵. 首先把一条无向边拆成两个有向边,如果边 \(A\) 的终点和边 \(B\) 的起点相同,那么我们就说从边 \(A\) 通向边 \(B\).但是,同源的有向边(也就是从同一条无向边拆成的两条有向边)之间不能建边. 但是为…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1875 有个限制是不能走回头路,比较麻烦: 所以把矩阵中的元素设成边的经过次数,单向边之间就好转移了: 最后从单向边的经过次数得到点的路径方案数. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; ; ],ct=,tot; struct N{ int hd…
传送门 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法. 现在给你学校的地图(假设每条路的长度都是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符合条件的路径 输入输出格式 输入格式: 第一行:五个整数N,M,t,A,B.其中N表示学校里的路口的个…
http://172.20.6.3/Problem_Show.asp?id=1354 http://www.lydsy.com/JudgeOnline/problem.php?id=1875  题意:求从起始点到终点走过的路程为x有多少种走法,不保证两点间只有一条路,刚走完一条路时不能原路返回,每条路长度为1.   把每条路更换为正反两条边,再造一条出到起点的边s造一条入为终点的边t,将每一条边作为邻接矩阵中的点,矩乘即可 注意题意告诉我们一条路中的正反两条边不能相连.   代码 #includ…
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec  Memory Limit: 64 MB Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每 天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法. 现在给你学校的地图(假设每条路的长度都 是一样的都是1),问长度为t,从给定…
题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法. 现在给你学校的地图(假设每条路的长度都是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符合条件的路径 输入输出格式 输入格式: 第一行:五个整数N,M,t,A,B.其中N表示…
矩阵快速幂...+快速乘就OK了 -------------------------------------------------------------------------------------- #include<bits/stdc++.h>   using namespace std;   typedef long long ll;   ll MOD, a, c, x, n, g;   ll MUL(ll a, ll b) { ll ans = 0; for(; b; b >…
实际上,对于位数相同的连续段,可以用矩阵快速幂求出最后的ans,那么题目中一共只有18个连续段. 分段矩阵快速幂即可. #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<cmath> #define ll long long using na…
题意: 求长度为n的不含长为m的指定子串的字符串的个数 1s, n<=1e9, m<=50 思路: 长见识了.. 设那个指定子串为s f[i][j]表示长度为i的字符串(其中后j个字符与s的前j个字符一致的情况下)的方法数 若匹配到s串长度为i的后缀加一个字符num可以组成最长长度为j的后缀,设a[i][j]为num的方法数 例如,s为12312,a为 9 1 0 0 0 08 1 1 0 0 08 1 0 1 0 09 0 0 0 1 08 1 0 0 0 1 (i,j都是从0到m-1) 如…
题目描述 一张N个点M条边的无向图,从A走到B,要求:每一次不能立刻沿着上一次的边的反方向返回.求方案数. 输入 第一行:五个整数N,M,t,A,B. N表示学校里的路口的个数 M表示学校里的路的条数 t表示HH想要散步的距离 A表示散步的出发点 B则表示散步的终点. 接下来M行 每行一组Ai,Bi,表示从路口Ai到路口Bi有一条路. 数据保证Ai != Bi,但不保证任意两个路口之间至多只有一条路相连接.  路口编号从0到N -1.  同一行内所有数据均由一个空格隔开,行首行尾没有多余空格.没…
BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理, 那么10^t就可以确定,加上快速幂就行了 ------------------------------------------------------------------------------------ #include<cstdio> #include<cstring>…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1875 题意概括 在一个无向图(有重边无自环)中走,不能在经过连续经过某一条边2次. 现在走t步,问有多少中从A到B的方案. 答案mod 45989 点数<=20,边数<=60,t<=230 题解 一开始没看到不能来回走这一个条件,所以还以为是一道水题. 发现这个之后,思考一下,发现还是一道水题. 如果没有这个限制条件,那么我们按照点构建矩阵,用快速幂优化就可以了. 但是有了这个之后就稍微…
矩阵乘法裸题..差分一下然后用矩阵乘法+快速幂就可以了. --------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm>   using namespace std;   const int maxn = 20;   typedef long long ll; t…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1898 当然是邻接矩阵做转移矩阵来快速幂. 对于鳄鱼,好在它们周期的lcm是12,也就是每12次就又一样了. 所以把12个转移矩阵合成一下,就可以每次乘一样的,进而快速幂.%12剩下的次数暴力一下. 学到了一些方便的东西,比如struct的构造函数没有参数之类的. #include<iostream> #include<cstdio> #include<cstring&g…
递推式很明显...但是要做矩阵乘法就得拆点..我一开始很脑残地对于每一条权值v>1的边都新建v-1个节点去转移...然后就TLE了...把每个点拆成9个就可以了...时间复杂度O((9N)^3*logT) -------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm>  …
link $solution:$ 将边化为点后重新建矩阵,跑$T-1$幂即可(因为跑的是新边). 最后直接找与$x,y$所相连的边即可. #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define int long long #define mod 45989 using namespace std; inline int read(){ ,ans=;ch…
如果没有题里的"不会立刻沿着刚刚走来的路走回"限制,那么直接矩乘计算k步的方案数 但加了这个限制,就不能以点来矩乘了,考虑边数<=60,如果以边建邻接矩阵呢?? 先拆边,再把每一个边和以其终点为起点的边相连,注意不能是拆前的同一条边. 然后矩阵乘喽. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mod 45989…
把双向边拆成2条单向边, 用边来转移...然后矩阵乘法+快速幂优化 --------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm>   using namespace std;   const int MOD = 45989; const…
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1196 Solved: 553 [Submit][Status][Discuss] Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多…
题面 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法. 现在给你学校的地图(假设每条路的长度都是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符合条件的路径 输入输出格式 输入格式: 第一行:五个整数N,M,t,A,B.其中N表示学校里的路口的个数…
题目链接 比较容易想到用f[i][j]表示走了i步后到达j点的方案数,但是题目要求不能走上一条走过的边 如果这样表示是不好转移的 可以考虑边,f[i][j]表示走了i步后到达第j条边的方案数,那么有 f[i][j] = ∑f[i-1][k] (边k能直接到达边j) 只要不走反向边,就保证了不会走上一条边了 步数很大,而这个方程显然是可以通过矩阵快速幂加速转移的 求初始边矩阵的t-1次方幂t',然后用系数矩阵(与src相连的边)乘以t',即为走了t条边后的方案数 (这个系数矩阵是为了只保留矩阵中起…
题面 传送门 正文 其实就是让你求有多少条长度为t的路径,但是有一个特殊条件:不能走过一条边以后又立刻反着走一次(如果两次经过同意条边中间隔了别的边是可以的) 如果没有这个特殊条件,我们很容易想到dp做法:设$dp\left[i\right]\left[j\right]$表示第i个时刻(初始算0),走到第j个点的答案总数 但是这里要限制不能反复走,那么直接设点会导致信息丢失 那我们怎么样才能让保存当前所在点的情况下,不丢失最后一条边的信息呢? 答案非常显然,我们只要设$dp\left[i\rig…
Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 1363  Solved: 646 [Submit][Status][Discuss] Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法. 现在给你学校的地图(…
题目链接:HH去散步 如果不考虑不能走上一次走的边的话,这道题就是一个矩乘的裸题. 现在有了这个条件其实也很好做.我们平常的矩阵都是按点建的,\(A_{i,j}\)表示从第\(i\)个点走到第\(j\)个点的方案数:这里把每条边拆成两条有向边,按边建立矩阵,\(A_{i,j}\)表示第\(i\)条边走到第\(j\)条边的方案数,然后直接矩乘即可. 下面贴代码: #include<iostream> #include<cstdio> #include<cstring> #…
思路:不能走走过来的路,变点交换跑矩阵快速幂. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> #define y1 skldjfskldjg #define y2 skldfjsklejg using namespace std; ; ; const int inf = 0x…
###[BZOJ1975]HH去散步 图论+矩阵 题目大意 要求出在一个m条边,n个点的图中,相邻两次走的边不能相同,求在t时间时从起点A走到终点B的路径方案总数.将答案mod45989 输入格式: 第一行:五个整数N,M,t,A,B. 后面的m行,每行有两个数\(a_i\) \(b_i\),表示路口\(a_i\) \(b_i\)有有一条边. 输出格式: 一个整数,表示答案. 输入输出样例 input 4 5 3 0 0 0 1 0 2 0 3 2 1 3 2 output 4 Hint 对于3…
BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因为HH是个喜欢变化的人,所以他每 天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法. 现在给你学校的地图(假设每条路的长度都 是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符合条件的路径 Input 第…
HH去散步 题目链接:https://www.luogu.org/problem/P2151 数据范围:略. 题解: 数据范围好小,让人不禁想用一些毒瘤算法,但是失败了. 这种类似时间啊这种有点重复味道的变量特别特别大,连枚举都会$T$的时候,而且存在一些数据比较小,我们考虑矩阵乘法. 至于状态,开始的时候想到的一定是$dp_{(i,j)}$表示时刻$i$到达了点$j$的方案数. 但是我们没办法判断下一条边和上次到达$j$的边是不是一条. 于是想办法怎么能把最后一条边压进状态. 显然,我们可以把…