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

Problem Description
春天到了, HDU校园里开满了花, 姹紫嫣红, 很漂亮. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线去教室, 可是因为时间问题, 每次仅仅能经过k个地方, 例如说, 这次葱头决定经过2个地方, 那他能够先去问鼎广场看看喷泉, 再去教室, 也能够先到体育场跑几圈, 再到教室. 他很想知道, 从A 点恰好经过k个点到达B点的方案数, 当然这个数有可能很大, 所以你仅仅要输出它模上1000的余数就能够了. 你能帮帮他么?

? 你可决定了葱头一天能看多少校花哦

Input
输入数据有多组, 每组的第一行是2个整数 n, m(0 < n <= 20, m <= 100) 表示校园内共同拥有n个点, 为了方便起见, 点从0到n-1编号,接着有m行, 每行有两个整数 s, t (0<=s,t<n) 表示从s点能到t点, 注意图是有向的.接着的一行是两个整数T,表示有T组询问(1<=T<=100),
接下来的T行, 每行有三个整数 A, B, k, 表示问你从A 点到 B点恰好经过k个点的方案数 (k < 20), 能够走反复边。假设不存在这种走法, 则输出0
当n, m都为0的时候输入结束
Output
计算每次询问的方案数, 因为走法非常多, 输出其对1000取模的结果
Sample Input
4 4 0 1 0 2 1 3 2 3 2 0 3 2 0 3 3 3 6 0 1 1 0 0 2 2 0 1 2 2 1 2 1 2 1 0 1 3 0 0
Sample Output
2 0 1 3
Author
小黑
Source
2008信息project学院集训队——选拔赛
Recommend
linle   |   We have carefully selected several similar problems for you:  2159 2154 2158 2156 2153 

中文题~

解题思路:经典矩阵算法。把给定的图转为邻接矩阵,即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【矩阵高速幂】相关推荐

  1. HDOJ 5411 CRB and Puzzle 矩阵高速幂

    直接构造矩阵,最上面一行加一排1.高速幂计算矩阵的m次方,统计第一行的和 CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  2. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations (矩阵高速幂)

    题目地址:http://codeforces.com/contest/551/problem/D 分析下公式能够知道,相当于每一位上放0或者1使得最后成为0或者1.假设最后是0的话,那么全部相邻位一定 ...

  3. POJ 3613 Cow Relays (floyd + 矩阵高速幂)

    题目大意: 求刚好经过K条路的最短路 我们知道假设一个矩阵A[i][j] 表示表示 i-j 是否可达 那么 A*A=B  B[i][j]  就表示   i-j 刚好走过两条路的方法数 那么同理 我们把 ...

  4. hdu 5411 CRB and Puzzle 矩阵高速幂

    链接 题解链接:http://www.cygmasot.com/index.php/2015/08/20/hdu_5411/ 给定n个点 常数m 以下n行第i行第一个数字表示i点的出边数.后面给出这些 ...

  5. hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)

    http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...

  6. HDOJ 2604 Queuing (递推+矩阵快速幂)

    点击打开链接 题意:给你一个长度为L的由m和f两种字母组成的字符串,定义存在fmf以及fff子串的都是不符合要求的串,问长度为L的符合要求的串有多少个? 解题思路: 首先找出递推关系式,先给出递推关系 ...

  7. HDU 2604 Queuing(矩阵高速幂)

    题目地址:HDU 2604 这题仅仅要推出公式来,构造矩阵就非常easy了.问题是推不出公式来..TAT.. 从递推的思路考虑.用f(n)表示n个人满足条件的结果.假设最后一个是m则前n-1人能够随意 ...

  8. HDU 2842 Chinese Rings(矩阵高速功率+递归)

    职务地址:HDU 2842 这个游戏是一个九连环的游戏. 如果当前要卸下前n个环.由于要满足前n-2个都卸下,所以要先把前n-2个卸下.须要f(n-2)次.然后把第n个卸下须要1次,然后这时候要卸下第 ...

  9. 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 ...

最新文章

  1. Eclipse设置背景色、字体大小
  2. mysql基础(一) 编译安装mysql5.5
  3. 算个欧拉函数给大家助助兴(米勒拉宾(判断素数)+Pollard_rho(求一个大数的因子 ))
  4. margin:auto实现绝对定位元素的水平垂直居中
  5. 一文详解「队列」,手撸队列的3种方法!
  6. phpcms导航高亮:“首页” 高亮显示(含代码、截图、案例)
  7. 云计算学习(5-1)云平台产品介绍-华为的FusionCloud产品
  8. 吃货少女走关西,美食小店大盘点
  9. 某大型银行深化系统技术方案之十四:服务层之服务调度机制
  10. python画一个祝福别人生日快乐_还在送生日贺卡?试试为家人朋友创作一个生日动画短视频吧...
  11. 一款好用的绘图软件Draw.io,比Visio好用
  12. 迈信EP100伺服驱动器量产型修改bug全套C源代码和硬件
  13. 腾达路由器linux开发,Tenda无线路由器远程命令执行后门漏洞
  14. 考研英语作文—谋篇布局
  15. 目标检测算法YOLO-V2详解
  16. c语言指针面试经典选择题及答案,C语言指针经典练习题-及答案
  17. js中foreach有三种写法,你知道吗
  18. 有趣的photoshop特效(1):凸透镜python实现
  19. 小黄鸭调试法,每个程序员都要知道的
  20. OpenStack Liberty 版本 All-In-One 一键安装ISO 及安装指导

热门文章

  1. Leetcode: Spiral Matrix
  2. Action 中 Response already committed 解决办法
  3. 心累了,就笑一笑,学会爱自己
  4. 最完美的ASCII 表
  5. 基础 PHP 数据类型
  6. 博科VP:闪存推动了与之相匹配的第六代FC的发展
  7. An internal error occurred during: quot;J2EE Component Mapping Updatequot;.
  8. Windows原生运行Linux的技术细节
  9. python入门经典必备推荐基础教程
  10. 越阳刚的男人越容易生女孩