矩阵乘法-vijos1603迷宫

https://vijos.org/p/1603
你想啊
a[i][j]代表i到j的方案树;
显然
a[i][j]+=a[i][k]*a[j][k]
这个就是矩阵的基本性质啊;
这个就是floyd啊;
和Fop_zz刷了几道vijos感觉很好啊;
省选题都是码农题啊;
vijos代码量不打,却很巧,右接近noip++啊;
算了我继续刷洛谷

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<map>
#define Ll long long
using namespace std;
struct mat{
    int m[55][55];
}a,c,ans;
int n,m,S,E,mo;
mat cheng(mat a,mat b){
    memset(c.m,0,sizeof c.m);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    for(int k=1;k<=n;k++)
        c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mo;
    return c;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)cin>>a.m[i][j];
    ans=a;
    scanf("%d%d%d%d",&m,&S,&E,&mo);
    m--;
    while(m){
        if(m&1)ans=cheng(a,ans);
        m=m>>1;
        a=cheng(a,a);
    }
    printf("%d",ans.m[S][E]);
}
posted @ 2017-03-27 13:52  largecube233  阅读(108)  评论(0编辑  收藏  举报