[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取模后的结果。
输入输出样例
3 2 1 2 2 3 2
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。
这道题我们可以从邻接矩阵的幂的意义考虑。
设现在有一个邻接矩阵AA。
那么A^kAk的意义是什么?(两个点之间若有边则A[u][v]=1A[u][v]=1)
从floydfloyd算法的角度考虑,不难发现A^kAk的第ii行第jj列的数字含义是从ii到jj经过kk步的路径方案总数。
从这个角度考虑,这个点就有了一种做法。
首先将这个图的邻接矩阵建出来,然后直接算这个矩阵的kk次方。
最后统计\sum\limits_{i=1}^{n}A[1][i]i=1∑nA[1][i]就是答案。
那么在原地停留和自爆怎么处理?
在原地停留很简单,我们只要认为每个点都有一个从自己到自己的自环即可。
那自爆呢?
我们可以将自爆这个状态也看成一个城市,就设它为编号00。
我们在邻接矩阵上从每个点都向这个点连一条边,这个点除了自己外不连其他出边。
这样就满足了任何一个点随时可以自爆,且无法恢复到其他状态。
最后,统计答案。
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 }
转载于:https://www.cnblogs.com/zhangbuang/p/10336004.html
[TJOI2017]可乐(矩阵快速幂)相关推荐
- 洛谷P3758/BZOJ4887 [TJOI2017] 可乐 [矩阵快速幂]
洛谷传送门,BZOJ传送门 可乐 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 299 Solved: 207 Description 加里敦星球的 ...
- 快速幂+矩阵快速幂模板
快速..运算 快速幂 运用位运算 代码 分析 矩阵快速幂 题目 分析 代码 拓一..: 快速幂 运用位运算 强大的位运算把我搞得蒙蒙的 理解了之后我表示很喜欢!!! 代码 int power(int ...
- 矩阵快速幂(矩阵加速)
//南昌理工ACM集训队 放心食用 矩阵加速 快速幂(前置技能) 矩阵快速幂 可乐 附个模板 最后小结 本人小白如有不对欢迎指正ლ(╹◡╹ლ) 矩阵加速 快速幂(前置技能) 对于普通的求a的b次方,一 ...
- BZOJ4887:[TJOI2017]可乐(矩阵乘法)
Description 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且 放在了加里敦星球的1号城市上.这个可乐机器人有三种行为:停在原地,去下一个相邻的 城市,自爆. ...
- 矩阵快速幂+构造方法
与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...
- 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂
原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...
- 快速幂 + 矩阵快速幂
快速幂 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #define LL lo ...
- HDU4549(矩阵快速幂+快速幂)
f(n)=a^f(n-1) + b^f(n-2):计算矩阵部分用矩阵快速幂:计算a的幂次和b的幂次用快速幂. #include<iostream> #include<algorith ...
- [HNOI2008]GT考试[矩阵快速幂+kmp优化的dp]
解题思路:假如说我们用f[i]表示长度为i的串能组合成无不吉利数字的组合的个数的话我们无法找到f[i]和f[i+1]的关系,就是我们下一位填某个数字会不会出现不吉利串,这就和你前面的串末尾于不吉利串重 ...
最新文章
- 倍增LCA NOIP2013 货车运输
- R语言与数据分析(9)R与Excel
- Py之dlib:Python库之dlib库的简介、安装、使用方法详细攻略
- Winform中设置ZedGraph鼠标悬浮显示距离最近曲线上的点的坐标值和X轴与Y轴的标题
- 关于DruidStatView监控信息
- 干不掉的钉钉:从哪来,往哪去?
- mysql索引类型 normal, unique, full text
- S3C2440裸奔篇之MMU
- 大学生研究生必备的数据竞赛平台
- 计算机编程语言分类与区别
- 很值得看看的中文翻译The Django Book
- 计算机考试用户注册,全国计算机等级考试报名系统账号注册和登录
- 无人机设计过程中的计算和假设
- 使用u盘量产工具修复写保护的u盘
- 【Java练习】图书管理系统【详解篇15+完整代码】
- 世界观的内涵是认识论模型
- python《pandas入门》实现Excel数据字段的拆分
- 基于tensorflow2.0的深度学习 一
- kind:Kubernetes in Docker,单机运行 Kubernetes 群集的最佳方案?
- 北京博奥智源,浅谈术语管理服务器软件开发所需功能设计