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; }
pain and happy in the cruel world.