bzoj1297 / P4159 [SCOI2009]迷路
阿新 • • 發佈:2018-11-04
簡單 pla lap display iostream pri lan 一個 mem
P4159 [SCOI2009]迷路
如果邊權只有 0/1 那麽不就是一個灰常簡單的矩陣快速冪嗎!
然鵝邊權 $<=9$
所以我們把每個點拆成9個點!
解決~
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define re register 5 using namespace std; 6 const int mod=2009; 7 int m,n,t;long long q; 8 struct matrix{ 9 int a[92View Code][92]; 10 matrix(){memset(a,0,sizeof(a));} 11 matrix operator * (const matrix &tmp) const{ 12 matrix c; 13 for(int i=1;i<=n;++i) 14 for(int j=1;j<=n;++j) 15 for(int k=1;k<=n;++k) 16 c.a[i][j]=(c.a[i][j]+a[i][k]*tmp.a[k][j])%mod;17 return c; 18 } 19 matrix Pow(matrix x,int y){ 20 matrix res; 21 for(int i=1;i<=n;++i) res.a[i][i]=1; 22 for(;y;y>>=1,x=x*x) 23 if(y&1) res=res*x; 24 return res; 25 } 26 }st; 27 int idx(int x,int y){return x+m*y;}//新點編號 28 int main(){ 29 scanf("%d%d",&m,&t);n=m*9; 30 for(int i=1;i<=m;++i){ 31 for(int j=1;j<=8;++j) 32 st.a[idx(i,j)][idx(i,j-1)]=1;//規定idx(i,0)作為原圖的點向其他點連邊,其他點與該點的邊權就轉化為連到idx(i,dist-1)上 33 scanf("%lld",&q); 34 for(int j=m;j>=1;--j,q/=10) 35 if(q%10) st.a[i][idx(j,q%10-1)]=1; 36 }st=st.Pow(st,t); 37 printf("%d",st.a[1][m]); 38 return 0; 39 }
bzoj1297 / P4159 [SCOI2009]迷路