标签:style lin namespace sizeof amp efi air bsp 矩阵加速
考虑如果只有距离为1的边,那我用在时间i到达某个点的状态数矩阵 乘上转移矩阵(就是边的邻接矩阵),就能得到i+1时间的
然后又考虑到边权只有1~9,那可以把边拆成只有距离为1的
具体做法是一个点拆成9个然后串联
1 #include<bits/stdc++.h> 2 #define pa pair<ll,ll> 3 #define CLR(a,x) memset(a,x,sizeof(a)) 4 #define MP make_pair 5 using namespace std; 6 typedef long long ll; 7 const int maxn=12,maxm=105,P=2009; 8 9 inline char gc(){ 10 return getchar(); 11 static const int maxs=1<<16;static char buf[maxs],*p1=buf,*p2=buf; 12 return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxs,stdin),p1==p2)?EOF:*p1++; 13 } 14 inline ll rd(){ 15 ll x=0;char c=gc();bool neg=0; 16 while(c<‘0‘||c>‘9‘){if(c==‘-‘) neg=1;c=gc();} 17 while(c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+c-‘0‘,c=gc(); 18 return neg?(~x+1):x; 19 } 20 21 int id[maxn][maxn],N,M,T; 22 int trans[maxm][maxm],tmp[maxm][maxm],ans[maxm][maxm]; 23 24 int main(){ 25 //freopen("","r",stdin); 26 int i,j,k=0; 27 N=rd();T=rd(); 28 for(i=1;i<=N;i++){ 29 for(j=1;j<=9;j++){ 30 id[i][j]=++M; 31 if(j!=1) trans[id[i][j]][id[i][j-1]]=1; 32 } 33 } 34 for(i=1;i<=N;i++){ 35 char s[13];scanf("%s",s+1); 36 for(j=1;j<=N;j++){ 37 if(s[j]!=‘0‘) trans[id[i][1]][id[j][s[j]-‘0‘]]=1; 38 } 39 } 40 T--; 41 memcpy(ans,trans,sizeof(ans)); 42 while(T){ 43 if(T&1){ 44 CLR(tmp,0); 45 for(i=1;i<=M;i++){ 46 for(j=1;j<=M;j++){ 47 for(k=1;k<=M;k++){ 48 tmp[i][j]=(tmp[i][j]+ans[i][k]*trans[k][j])%P; 49 } 50 } 51 } 52 memcpy(ans,tmp,sizeof(tmp)); 53 } 54 CLR(tmp,0); 55 for(i=1;i<=M;i++){ 56 for(j=1;j<=M;j++){ 57 for(k=1;k<=M;k++){ 58 tmp[i][j]=(tmp[i][j]+trans[i][k]*trans[k][j])%P; 59 } 60 } 61 } 62 memcpy(trans,tmp,sizeof(tmp)); 63 T>>=1; 64 } 65 printf("%d\n",ans[id[1][1]][id[N][1]]); 66 return 0; 67 }
标签:style lin namespace sizeof amp efi air bsp 矩阵加速
原文地址:https://www.cnblogs.com/Ressed/p/10028563.html