1. 程式人生 > >[TJOI2017] 可樂

[TJOI2017] 可樂

bzoj 4887 傳送門

水題啊......

把原地不動看成是自環,把自爆看作是走到了0點就行了。

所有點都能走到0點,而0點只能走到自己。

然後鄰接矩陣自乘即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 const int mod=2017;
 7 
 8 struct matrix
 9 {
10     int a[35][35];
11 }e;
12 
13 int n,m,t;
14 15 matrix mul(matrix &q,matrix &w) 16 { 17 matrix ret; 18 for(int i=0;i<=n;i++) 19 { 20 for(int j=0;j<=n;j++) 21 { 22 ret.a[i][j]=0; 23 for(int k=0;k<=n;k++) 24 ret.a[i][j]+=q.a[i][k]*w.a[k][j]; 25 ret.a[i][j]%=mod;
26 } 27 } 28 return ret; 29 } 30 31 matrix ksm(matrix b,int p) 32 { 33 matrix ret=b; 34 p--; 35 while(p) 36 { 37 if(p&1)ret=mul(ret,b); 38 b=mul(b,b); 39 p>>=1; 40 } 41 return ret; 42 } 43 44 int main() 45 {
46 scanf("%d%d",&n,&m); 47 for(int i=1;i<=m;i++) 48 { 49 int x,y; 50 scanf("%d%d",&x,&y); 51 e.a[x][y]=e.a[y][x]=1; 52 } 53 for(int i=1;i<=n;i++) 54 { 55 e.a[i][0]=e.a[i][i]=1; 56 } 57 e.a[0][0]=1; 58 scanf("%d",&t); 59 matrix ans=ksm(e,t); 60 int sum=0; 61 for(int i=0;i<=n;i++) 62 sum=(sum+ans.a[1][i])%mod; 63 printf("%d",sum); 64 return 0; 65 }