bzoj1297: [SCOI2009]迷路

矩乘题。

如果距离就是1的话直接自乘T次就可以了。

但是这个不是,本来以为没啥区别,但是还是不行的。

然后就是拆10个点搞,表示到该点的距离,其实问题不大,但是有点颓就是没怎么思考就写了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

int n;

struct Matrix
{
    int mp[110][110];
}A,ans;
Matrix cheng(Matrix a,Matrix b)
{
    Matrix c;
    memset(c.mp,0,sizeof(c.mp));
    for(int i=1;i<=n*10;i++)
        for(int j=1;j<=n*10;j++)
            for(int k=1;k<=n*10;k++)
                c.mp[i][j]=(c.mp[i][j]+a.mp[i][k]*b.mp[k][j])%2009;
    return c;
}

char ss[20];
int main()
{
    int T;
    scanf("%d%d",&n,&T);
    memset(A.mp,0,sizeof(A.mp));
    
    for(int i=1;i<=n;i++)
    {
        scanf("%s",ss+1);
        for(int j=1;j<=n;j++)
            if(ss[j]!='0')
            {
                int x=ss[j]-'0';
                A.mp[(i-1)*10+1][(j-1)*10+x]=1;
            }
    }
    for(int i=1;i<=n;i++)
        for(int j=10;j>1;j--)
            A.mp[(i-1)*10+j][(i-1)*10+j-1]=1;
    
    for(int i=1;i<=n*10;i++)ans.mp[i][i]=1;
        
    while(T>0)
    {
        if(T%2==1)ans=cheng(ans,A);
        A=cheng(A,A);T/=2;
    }
    printf("%d\n",ans.mp[1][(n-1)*10+1]);
    return 0;
}

 

posted @ 2018-02-05 14:37  AKCqhzdy  阅读(148)  评论(0编辑  收藏  举报