[TJOI2017]可乐
Posted 66dzb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[TJOI2017]可乐相关的知识,希望对你有一定的参考价值。
题目描述
加里敦星球的人们特别喜欢喝可乐。因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上。这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆。它每一秒都会随机触发一种行为。现 在给加里敦星球城市图,在第0秒时可乐机器人在1号城市,问经过了t秒,可乐机器人的行为方案数是多少?
输入格式
第一行输入两个正整数况N,M,N表示城市个数,M表示道路个数。(1 <= N <=30,0 < M < 100)
接下来M行输入u,v,表示u,v之间有一条道路。(1<=u,v <= n)保证两座城市之间只有一条路相连。
最后输入入时间t
输出格式
输出可乐机器人的行为方案数,答案可能很大,请输出对2017取模后的结果。
输入输出样例
输入 #1
3 2
1 2
2 3
2
输出 #1
8
说明/提示
【样例解释】
1 ->爆炸
1 -> 1 ->爆炸
1 -> 2 ->爆炸
1 -> 1 -> 1
1 -> 1 -> 2
1 -> 2 -> 1
1 -> 2 -> 2
1 -> 2 -> 3
【数据范围】
对于20%的pn,有1 < t ≤ 1000
对于100%的pn,有1 < t ≤ 10^6。
【解题思路】
对于矩阵a的k次方,它的i行j列实际上就是跑k步,i恰好走到j的对应方案数。
【code】
1 #include<cstdio>
2 #include<cstring>
3 #include<cstdlib>
4 #include<cctype>
5 #include<cmath>
6 #include<iostream>
7 #include<algorithm>
8 #include<vector>
9 #include<set>
10 #include<map>
11 #include<queue>
12 #include<stack>
13 typedef long long ll;
14 typedef unsigned long long ull;
15 using namespace std;
16 const int P=2017;
17 struct Matrix
18 int a[31][31];
19 inline Matrix operator * (const Matrix &rhs)
20
21 Matrix ret;
22 memset(&ret,0,sizeof ret);
23 for(int i=0;i<=30;i++)
24 for(int j=0;j<=30;j++)
25 for(int k=0;k<=30;k++)
26 (ret.a[i][j]+=a[i][k]*rhs.a[k][j]%P)%=P;
27 return ret;
28
29 mp;
30 Matrix ksm(Matrix &a,int b)
31
32 Matrix ret;
33 memset(&ret,0,sizeof ret);
34 for(int i=0;i<=30;i++) ret.a[i][i]=1;
35 while(b)
36
37 if(b&1) ret=ret*a;
38 a=a*a;b>>=1;
39
40 return ret;
41
42 int u,v,n,m,t;
43 int main()
44
45 scanf("%d%d",&n,&m);
46 for(int i=1;i<=m;i++)
47
48 scanf("%d%d",&u,&v);
49 mp.a[u][v]=1;mp.a[v][u]=1;
50
51 for(int i=0;i<=n;i++)
52 mp.a[i][i]=1;
53 for(int i=1;i<=n;i++) mp.a[i][0]=1;
54 int ans=0;
55 scanf("%d",&t);
56 Matrix anss=ksm(mp,t);
57 for(int i=0;i<=n;i++) (ans+=anss.a[1][i])%=P;
58 printf("%d\n",ans);
59
以上是关于[TJOI2017]可乐的主要内容,如果未能解决你的问题,请参考以下文章