Description
加里敦星球的人们特别喜欢喝可乐。因而,他们的敌对星球研发出了一个可乐机器人,并且
放在了加里敦星球的1号城市上。这个可乐机器人有三种行为:停在原地,去下一个相邻的
城市,自爆。它每一秒都会随机触发一种行为。现在给出加里敦星球城市图,在第0秒时可
乐机器人在1号城市,问经过了t秒,可乐机器人的行为方案数是多少?
Input
第一行输入两个正整数N,M表示城市个数,M表示道路个数。(1≤N≤30,0≤M≤100)
接下来M行输入u,v表示u,v之间有一条道路。
(1≤u,v≤n)保证两座城市之间只有一条路相连。
最后输入时间t。1<t≤10^6
Output
输出可乐机器人的行为方案数,答案可能很大,请输出对2017取模后的结果。
Sample Input
3 2 1 2 2 3 2
Sample Output
8
Solution
一开始傻了在想DP后来才发现这是个矩阵快速幂模板题……把邻接矩阵做t次幂,邻接矩阵a[i][j]的意义就成了从i走到j的方案数这个题只需要把每个点的自爆引一条单向边到n+1就好了,停留就连一条自环
Code
1 #include2 #include 3 #include 4 #define MOD (2017) 5 using namespace std; 6 7 int n,m,ans,u,v,t; 8 9 struct Matrix10 {11 int m[32][32];12 void clear(){memset(m,0,sizeof(m));}13 }A,G;14 15 Matrix operator * (Matrix a,Matrix b)16 {17 Matrix ans; ans.clear();18 for (int i=1; i<=n+1; ++i)19 for (int j=1; j<=n+1; ++j)20 for (int k=1; k<=n+1; ++k)21 (ans.m[i][j]+=a.m[i][k]*b.m[k][j])%=MOD;22 return ans;23 }24 25 Matrix Qpow(Matrix a,int p)26 {27 Matrix ans; ans.clear();28 for (int i=1; i<=n+1; ++i) ans.m[i][i]=1;29 while (p)30 {31 if (p&1) ans=ans*a;32 a=a*a; p>>=1;33 }34 return ans;35 }36 37 int main()38 {39 scanf("%d%d",&n,&m);40 for (int i=1; i<=m; ++i)41 {42 scanf("%d%d",&u,&v);43 G.m[u][v]=G.m[v][u]=1;44 }45 for (int i=1; i<=n+1; ++i)46 G.m[i][n+1]=1,G.m[i][i]=1;47 scanf("%d",&t); 48 G=Qpow(G,t);49 for (int i=1; i<=n+1; ++i)50 (ans+=G.m[1][i])%=MOD;51 printf("%d",ans);52 }