HDOJ How many ways?? 2157【矩阵高速幂】
How many ways?
? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2046 Accepted Submission(s): 758
? 你可决定了葱头一天能看多少校花哦
接下来的T行, 每行有三个整数 A, B, k, 表示问你从A 点到 B点恰好经过k个点的方案数 (k < 20), 能够走反复边。假设不存在这种走法, 则输出0
当n, m都为0的时候输入结束
中文题~
解题思路:经典矩阵算法。把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j。令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点)。类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数。同理,假设要求经过k步的路径数,我们仅仅须要二分求出A^k就可以。
第一道矩阵高速幂。写的比較乱。并且这样的写法时间复杂度较高,没有优化。只是比較easy看懂。
矩阵高速幂预备知识:
①矩阵相乘规则:
矩阵与矩阵相乘 第一个矩阵的列数必须等于第二个矩阵的行数 假如第一个是m*n的矩阵 第二个是n*p的矩阵 则结果就是m*p的矩阵 且得出来的矩阵中元素具有下面特点:
第一行第一列元素为第一个矩阵的第一行的每一个元素和第二个矩阵的第一列的每一个元素乘积的和 以此类推 第i行第j列的元素就是第一个矩阵的第i行的每一个元素与第二个矩阵第j列的每一个元素的乘积的和。
②单位矩阵:
n*n的矩阵 mat ( i , i )=1; 不论什么一个矩阵乘以单位矩阵就是它本身 n*单位矩阵=n, 能够把单位矩阵等价为整数1.
③高速幂:
这里矩阵高速幂等价于整数的高速幂,这里不再具体讲述
上代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>int s[25][25];
int b[25][25];
int n,m;
int a[25][25];void Mat(int x[25][25],int y[25][25],int modn)
{int c[25][25];memset(c,0,sizeof(c)); //记得初始化 for(int i=0;i<n;i++)for(int j=0;j<n;j++)for(int k=0;k<n;k++)c[i][j]=(c[i][j]+x[i][k]*y[k][j]%modn)%modn;for(int i=0;i<n;i++)for(int j=0;j<n;j++)x[i][j]=c[i][j];
}int Matrix(int begin,int end,int k)
{ for(int i=0;i<n;i++){ //初始化一个单位矩阵 for(int j=0;j<n;j++){a[i][j]=(i==j);}}for(int i=0;i<n;i++){ //记得用s保存再赋给b,不然b值变了之后结果就不正确了 for(int j=0;j<n;j++){b[i][j]=s[i][j];}}while(k){if(k&1)Mat(a,b,1000);Mat(b,b,1000);k>>=1;}return a[begin][end];
}int main()
{while(scanf("%d%d",&n,&m),n!=0||m!=0){int S,G;memset(b,0,sizeof(b));memset(s,0,sizeof(s));for(int i=0;i<m;i++){scanf("%d%d",&S,&G);s[S][G]=1;}int T;scanf("%d",&T);int B,E,k;while(T--){scanf("%d%d%d",&B,&E,&k);int res=Matrix(B,E,k);printf("%d\n",res);}}return 0;
}
HDOJ How many ways?? 2157【矩阵高速幂】相关推荐
- HDOJ 5411 CRB and Puzzle 矩阵高速幂
直接构造矩阵,最上面一行加一排1.高速幂计算矩阵的m次方,统计第一行的和 CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others) Memory ...
- Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations (矩阵高速幂)
题目地址:http://codeforces.com/contest/551/problem/D 分析下公式能够知道,相当于每一位上放0或者1使得最后成为0或者1.假设最后是0的话,那么全部相邻位一定 ...
- POJ 3613 Cow Relays (floyd + 矩阵高速幂)
题目大意: 求刚好经过K条路的最短路 我们知道假设一个矩阵A[i][j] 表示表示 i-j 是否可达 那么 A*A=B B[i][j] 就表示 i-j 刚好走过两条路的方法数 那么同理 我们把 ...
- hdu 5411 CRB and Puzzle 矩阵高速幂
链接 题解链接:http://www.cygmasot.com/index.php/2015/08/20/hdu_5411/ 给定n个点 常数m 以下n行第i行第一个数字表示i点的出边数.后面给出这些 ...
- hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)
http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...
- HDOJ 2604 Queuing (递推+矩阵快速幂)
点击打开链接 题意:给你一个长度为L的由m和f两种字母组成的字符串,定义存在fmf以及fff子串的都是不符合要求的串,问长度为L的符合要求的串有多少个? 解题思路: 首先找出递推关系式,先给出递推关系 ...
- HDU 2604 Queuing(矩阵高速幂)
题目地址:HDU 2604 这题仅仅要推出公式来,构造矩阵就非常easy了.问题是推不出公式来..TAT.. 从递推的思路考虑.用f(n)表示n个人满足条件的结果.假设最后一个是m则前n-1人能够随意 ...
- HDU 2842 Chinese Rings(矩阵高速功率+递归)
职务地址:HDU 2842 这个游戏是一个九连环的游戏. 如果当前要卸下前n个环.由于要满足前n-2个都卸下,所以要先把前n-2个卸下.须要f(n-2)次.然后把第n个卸下须要1次,然后这时候要卸下第 ...
- HDOJ 1757 A Simple Math Problem(矩阵快速幂)
2018-5-24 简单的矩阵快速幂问题,重点是如何找到对应关系. f(10) a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 f(9) f(9) 1 0 0 0 0 0 0 0 0 0 ...
最新文章
- Eclipse设置背景色、字体大小
- mysql基础(一) 编译安装mysql5.5
- 算个欧拉函数给大家助助兴(米勒拉宾(判断素数)+Pollard_rho(求一个大数的因子 ))
- margin:auto实现绝对定位元素的水平垂直居中
- 一文详解「队列」,手撸队列的3种方法!
- phpcms导航高亮:“首页” 高亮显示(含代码、截图、案例)
- 云计算学习(5-1)云平台产品介绍-华为的FusionCloud产品
- 吃货少女走关西,美食小店大盘点
- 某大型银行深化系统技术方案之十四:服务层之服务调度机制
- python画一个祝福别人生日快乐_还在送生日贺卡?试试为家人朋友创作一个生日动画短视频吧...
- 一款好用的绘图软件Draw.io,比Visio好用
- 迈信EP100伺服驱动器量产型修改bug全套C源代码和硬件
- 腾达路由器linux开发,Tenda无线路由器远程命令执行后门漏洞
- 考研英语作文—谋篇布局
- 目标检测算法YOLO-V2详解
- c语言指针面试经典选择题及答案,C语言指针经典练习题-及答案
- js中foreach有三种写法,你知道吗
- 有趣的photoshop特效(1):凸透镜python实现
- 小黄鸭调试法,每个程序员都要知道的
- OpenStack Liberty 版本 All-In-One 一键安装ISO 及安装指导