[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 }
原文地址:https://www.cnblogs.com/cervusy/p/9974630.html