码迷,mamicode.com
首页 > 其他好文 > 详细

4887. [TJOI2017]可乐【矩阵乘法】

时间:2018-07-28 11:52:11      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:include   意义   out   道路   多少   string   答案   esc   cst   

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
 
一开始傻了在想DP
后来才发现这是个矩阵快速幂模板题……
把邻接矩阵做t次幂,邻接矩阵a[i][j]的意义就成了从i走到j的方案数
这个题只需要把每个点的自爆引一条单向边到n+1就好了,停留就连一条自环
 
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define MOD (2017)
 5 using namespace std;
 6 
 7 int n,m,ans,u,v,t;
 8 
 9 struct Matrix
10 {
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 }

4887. [TJOI2017]可乐【矩阵乘法】

标签:include   意义   out   道路   多少   string   答案   esc   cst   

原文地址:https://www.cnblogs.com/refun/p/9380785.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!