Description

加里敦星球的人们特别喜欢喝可乐。因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上。这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆。它每一秒都会随机触发一种行为。现 在给加里敦星球城市图,在第0秒时可乐机器人在1号城市,问经过了t秒,可乐机器人的行为方案数是多少?

Input

第一行输入两个正整数况N,M,N表示城市个数,M表示道路个数。(1 <= N <=30,0 < M < 100)

接下来M行输入u,v,表示u,v之间有一条道路。(1<=u,v <= n)保证两座城市之间只有一条路相连。

最后输入入时间t

Output

输出可乐机器人的行为方案数,答案可能很大,请输出对2017取模后的结果。

Sample Input

  1. 3 2
  2. 1 2
  3. 2 3
  4. 2

Sample Output

  1. 8

HINT

【样例解释】

  1. 1 ->爆炸
  2. 1 -> 1 ->爆炸
  3. 1 -> 2 ->爆炸
  4. 1 -> 1 -> 1
  5. 1 -> 1 -> 2
  6. 1 -> 2 -> 1
  7. 1 -> 2 -> 2
  8. 1 -> 2 -> 3

【数据范围】 对于20%的pn,有1 < t ≤ 1000

对于100%的pn,有1 < t ≤ 10^6。

题解

考虑朴素的$DP$:

$f[i][j][0]$表示第$i$时刻,在城市$j$爆炸的方案数,$f[i][j][1]$表示第i时刻,在城市$j$不爆炸的方案数

$f[i][j][0]=f[i-1][j][0]+f[i-1][j][1]$,$f[i][j][1]=f[i][j][1]+f[i][k][1]$($k$是$j$的相邻结点)

这样是要$MLE$的,显然状态的答案只与前一状态相关,直接滚动即可

可是依旧$T$了。

我们发现是城市数量很少,用邻接矩阵存。有矩阵的话就可以矩阵加速了。

我们定义矩阵$S$为$1*(n+1)$答案矩阵,$S[0][0]$表示$t$秒前(包括$t$秒)爆炸的方案总数;$S[0][i]$,$1<=i<=n$表示$t$秒时在点$i$的方案总数,初始$S[0][1]=1$;

矩阵$T$为$(n+1)*(n+1)$的邻接矩阵,除此之外:注意$T[i][0]=1$,$0<=i<=n$为了统计“爆炸”的情况;$T[i][i]=1$表示停在$i$点不动。

显然我们需要$S*=T^t$,最后答案就是$\sum _{i=0} ^n S[0][i]$。

  1. //It is made by Awson on 2017.10.3
  2. #include <set>
  3. #include <map>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <queue>
  7. #include <stack>
  8. #include <vector>
  9. #include <cstdio>
  10. #include <string>
  11. #include <cstring>
  12. #include <cstdlib>
  13. #include <iostream>
  14. #include <algorithm>
  15. #define LL long long
  16. #define Max(a, b) ((a) > (b) ? (a) : (b))
  17. #define Min(a, b) ((a) < (b) ? (a) : (b))
  18. #define sqr(x) ((x)*(x))
  19. #define insert INSERT
  20. using namespace std;
  21. const int MOD = ;
  22. void read(int &x) {
  23. char ch; bool flag = ;
  24. for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || ); ch = getchar());
  25. for (x = ; isdigit(ch); x = (x<<)+(x<<)+ch-, ch = getchar());
  26. x *= -*flag;
  27. }
  28.  
  29. int n, m, u, v, t;
  30. struct mat {
  31. int a[][];
  32. mat () {
  33. memset(a, , sizeof(a));
  34. }
  35. mat (int _a[][]) {
  36. for (int i = ; i <= n; i++)
  37. for (int j = ; j <= n; j++)
  38. a[i][j] = _a[i][j];
  39. }
  40. mat operator * (const mat &b) const{
  41. mat ans;
  42. for (int i = ; i <= n; i++)
  43. for (int j = ; j <= n; j++)
  44. for (int k = ; k <= n; k++)
  45. (ans.a[i][j] += a[i][k]*b.a[k][j]) %= MOD;
  46. return ans;
  47. }
  48. }S, T;
  49.  
  50. void work() {
  51. read(n), read(m);
  52. for (int i = ; i <= m; i++) {
  53. read(u), read(v);
  54. T.a[u][v] = T.a[v][u] = ;
  55. }
  56. for (int i = ; i <= n; i++)
  57. T.a[i][] = T.a[i][i] = ;
  58. S.a[][] = ;
  59. read(t);
  60. while (t) {
  61. if (t&) S = S*T;
  62. t >>= ;
  63. T = T*T;
  64. }
  65. int ans = ;
  66. for (int i = ; i <= n; i++)
  67. (ans += S.a[][i]) %= MOD;
  68. printf("%d\n", ans);
  69. }
  70. int main() {
  71. work();
  72. return ;
  73. }

[TJOI 2017]可乐的更多相关文章

  1. [TJOI 2017]异或和

    Description 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题 ...

  2. Week Three

    2018.12.10 1.[BZOJ 4818][P 3702] 2.[AGC007 A] 3.[AGC007 B] 4.[AGC007 C] 5.[AGC007 D] 2018.12.11 1.[B ...

  3. 壮美大山包-2017中国大山包国际超百公里ITRA积分赛赛记

    2017年4月份用时28个多小时跑完江南100,付出的代价是双脚多达8个以上的水泡.所以接下来的4月29日的环汶川越野赛果断的从60公里换到了30公里组,慢悠悠的完成了. 虽然在赛道上一度想再也不参加 ...

  4. [TJOI2017]可乐

    题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆.它每一秒都会随机 ...

  5. Luogu 3758 [TJOI2017]可乐(有向图邻接矩阵幂的意义 矩阵快速幂)

    题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆.它每一秒都会随机 ...

  6. 【BZOJ4887】[TJOI2017]可乐(矩阵快速幂)

    [BZOJ4887][TJOI2017]可乐(矩阵快速幂) 题面 BZOJ 洛谷 题解 模板题??? #include<iostream> #include<cstdio> # ...

  7. BZOJ4887: [Tjoi2017]可乐 矩阵快速幂

    Description 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且 放在了加里敦星球的1号城市上.这个可乐机器人有三种行为:停在原地,去下一个相邻的 城市,自爆. ...

  8. P3758 [TJOI2017]可乐

    题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆.它每一秒都会随机 ...

  9. 洛谷P3758/BZOJ4887 [TJOI2017] 可乐 [矩阵快速幂]

    洛谷传送门,BZOJ传送门 可乐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 299  Solved: 207 Description 加里敦星球的人 ...

随机推荐

  1. C语言程序设计(基础)- 第0次作业

    亲爱的同学们,恭喜你成为一名大学生,我也很荣幸能够带大家一起学习大学的第一门专业基础课.还在军训的你,肯定对大学生活和计算机专业有着美好的憧憬,那么大学生活是什么样子的那?计算机专业应该怎么学习那?请 ...

  2. 测试与发布(Beta版本)

    评分基准: 按时交 - 有分(测试报告-10分,发布说明-10分,展示博客-10分),检查的项目包括后文的两个方面 测试报告(基本完成5分,根据完成质量加分,原则上不超过满分10分) 发布说明(基本完 ...

  3. 和为S的连续正数序列——牛客网(剑指offer)

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  4. Alpha冲刺Day6

    Alpha冲刺Day6 一:站立式会议 今日安排: 由张梨贤继续完成前一天委托第三方剩余的内容,并完成委托情况查看这一子模块 由黄腾飞继续完成前一天企业自查风险管理剩余的内容,并完成风险上报这一子模块 ...

  5. 2017-2018-1 我爱学Java 第六七周 作业

    团队六七周作业 完善版需求规格说明书 制定团队编码规范 数据库设计 后端架构设计 TODOList 参考资料 完善版需求规格说明书 <需求规格说明书>初稿不足之处: 1.开发工具写错 2. ...

  6. 201621123031 《Java程序设计》第2周学习总结

    Week02-Java基本语法与类库 1. 本周学习总结 本周讲了Java的基本数据类型,主要分为八类(byte,short,int,long,double,float,char,boolean),其 ...

  7. bzoj千题计划217:bzoj2333: [SCOI2011]棘手的操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=2333 读入所有数据,先模拟一遍所有的合并操作 我们不关心联通块长什么样,只关心联通块内有谁 所以可以 ...

  8. SpringMVC之HandlerMapping的使用

    上篇博客在了解SpringMVC的工作流程时留了一些疑问,今天先学习下HandlerMapping,在HandlerMapping中可以通过HandlerExecutionChain getHandl ...

  9. Golang学习--开篇

    最近开始接收一个新项目,是使用Golang写的,需要重新捡起Golang来,于是就有了这个系列博客. Golang的环境配置,我就不说了,让我们直接开始. Golang官网:https://golan ...

  10. Mac使用brew安装软件

    Homebrew官方网站:https://brew.sh/1,安装brew,Mac中打开Termal输入命令: /usr/bin/ruby -e "$(curl -fsSL https:// ...