Vijos1603 迷宫

题目链接: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

 

posted on 2015-12-08 21:34  ACMICPC  阅读(270)  评论(0编辑  收藏  举报

导航