#include<iostream>
#include<cstring>
using namespace std;
#define ll long long
const int maxx=101;
ll MOD=2009;
struct Mat
{
ll m[maxx][maxx];
int r,l;
void Basic()
{
if(l!=r)
throw "²»ÊÇÁÚ½Ó¾ØÕó";
for(int i=0; i<r; i++)
for(int j=0; j<r; j++)
m[i][j]=(i==j);
}
Mat operator *(const Mat&c)const
{
Mat er;
memset(er.m,0,sizeof(er.m));
if(l!=c.r)
throw "sad";
er.r=r;
er.l=c.l;
for(int i=0; i<r; i++)
for(int j=0; j<c.l; j++)
for(int k=0; k<l; k++)
{
er.m[i][j]=(er.m[i][j]+m[i][k]*c.m[k][j])%MOD;
}
return er;
}
friend ostream& operator<<(ostream &in,const Mat &c);
};
ostream& operator<<(ostream &in,const Mat &c)
{
for(int i=0; i<c.r; i++)
{
for(int j=0; j<c.l; j++)
in<<c.m[i][j]<<' ';
in<<endl;
}
return in;
}
int n,k;
ll mp[maxx][maxx];
ll powsM(Mat &a,ll b)
{
Mat ans;
ans.l=ans.r=n*9;
ans.Basic();
while(b)
{
if(b&1)
ans=ans*a;
a=a*a;
b>>=1;
}
return ans.m[0][(n-1)*9];
}
int main()
{
//
cin>>n>>k;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
char t;
cin>>t;
mp[i][j]=t-'0';
}
//0_1_2_3 4 5 6 7 8
Mat foke;
foke.l=foke.r=n*9;
for(int i=0;i<n*9;i++)
if((i+1)%9){
foke.m[i][i+1]=1;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(mp[i][j]==0)continue;
foke.m[9*i+(mp[i][j]-1)][j*9]=1;
}
cout<<powsM(foke,k)<<endl;
return 0;
}
一本通1647:迷路
最新推荐文章于 2024-08-25 23:11:21 发布