码迷,mamicode.com
首页 > 其他好文 > 详细

Vijos1603 迷宫

时间:2015-12-08 22:04:55      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:https://vijos.org/p/1603

技术分享

矩阵快速幂,答案是原矩阵的m次幂的第s行第f列

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #define rep(i,l,r) for(int i=l; i<=r; i++)
 6 #define clr(x,y) memset(x,y,sizeof(x))
 7 using namespace std;
 8 const int maxn = 51;
 9 int n,m,s,f,KPM;
10 struct matrix{
11     int m[maxn][maxn];
12     matrix(){
13         clr(m,0);
14     }
15     void init(){
16         rep(i,1,n) m[i][i] = 1;
17     }
18     matrix operator * (const matrix &y) const {
19         matrix ret;
20         rep(i,1,n) rep(j,1,n) rep(k,1,n)
21         ret.m[i][j] = (ret.m[i][j] + m[i][k] * y.m[k][j]) % KPM;
22         return ret;
23     }
24 }a;
25 inline int read(){
26     int ans = 0, f = 1;
27     char c = getchar();
28     while (!isdigit(c)){
29         if (c == -) f = -1;
30         c = getchar();
31     }
32     while (isdigit(c)){
33         ans = ans * 10 + c - 0;
34         c = getchar();
35     }
36     return ans * f;
37 }
38 matrix qpow(matrix x,int y){
39     matrix ret, b = x; ret.init();
40     while (y){
41         if (y & 1) ret = ret * b;
42         b = b * b;
43         y >>= 1;
44     }
45     return ret;
46 }
47 int main(){
48     n = read();
49     rep(i,1,n) rep(j,1,n) a.m[i][j] = read();
50     m = read(); s = read(); f = read(); KPM = read();
51     a = qpow(a,m);
52     printf("%d\n",a.m[s][f]);
53     return 0;
54 }
View Code

 

Vijos1603 迷宫

标签:

原文地址:http://www.cnblogs.com/jimzeng/p/vijos1603.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!