洛谷P3758/BZOJ4887 [TJOI2017] 可乐 [矩阵快速幂]
洛谷传送门,BZOJ传送门
可乐
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 299 Solved: 207
Description
Input
Output
输出可乐机器人的行为方案数,答案可能很大,请输出对2017取模后的结果。
Sample Input
1 2
2 3
2
Sample Output
HINT
Source
分析:
一道人类智慧题,思路无比妙。
大多数人第一眼看到这题反应应该都是$DP$,出题人貌似也没想卡一般的$DP$(用$DP$+矩阵加速也是可以以非常优秀的效率过掉的),因此写的好看的$DP$也可以过,不过可能会需要吸一口氧气。
正解是矩阵快速幂。
嗯???矩阵快速幂??这题和矩阵快速幂有关系??是的,正解就是矩阵快速幂。juruo一开始也没想到,还是看了一位julao的思路才豁然开朗。
首先看,$n$的范围只有$30$,明显可以用邻接矩阵。而这题的突破口就在这里。我们来思考,如果对邻接矩阵$A$做快速幂会怎样?
从$Floyd$算法的角度分析,没有边权时(即默认所有边的边权为$1$时),$A^k$中的任意一个元$a_{i,j}$表示从$i$到$j$经过$k$条边的方案数。这个不太方便字面上解释,可以自己根据矩阵乘法的法则结合具体例子分析一下。
对于这题,因为可以留在原地,所以我们可以把所有点都加上一个自环。还有爆炸的情况,我们可以把爆炸当作第$0$号点,并单方面建立所有点到$0$号点的单向边,这样的过的话到达$0$号点以后就不会再到其他点,就能表示出爆炸的情况了。最后统计的答案应该就是从$1$号点到所有点经过$k$条边的情况总和,也就是$\sum ^n_{i=0}a[1][i]$。
剩下的就是矩阵快速幂的模板了。
不得不说,真是一道人类智慧题。
Code:
//It is made by HolseLee on 6th Sep 2018 //Lougu.org P3758 #include<cstdio> #include<cstring> #include<algorithm> using namespace std;const int mod=2017; int n,m,t,ans; struct Matrix {int a[31][31];Matrix() { memset(a,0,sizeof(a)); }Matrix(int b[31][31]) { memcpy(a,b,sizeof(a)); }friend Matrix operator * (const Matrix x,const Matrix y) {Matrix ret;for(int i=0; i<=30; ++i) for(int j=0; j<=30; ++j) for(int k=0; k<=30; ++k) {ret.a[i][j]=(ret.a[i][j]+(x.a[i][k]*y.a[k][j]))%mod;}return ret;} }H,L;int main() {scanf("%d%d",&n,&m);int x,y;for(int i=1; i<=m; ++i) {scanf("%d%d",&x,&y);H.a[x][y]=H.a[y][x]=1;}for(int i=0; i<=n; ++i) H.a[i][0]=1, H.a[i][i]=1;for(int i=0; i<=n; ++i) L.a[i][i]=1;scanf("%d",&t);while( t ) {if( t&1 ) L=L*H;t>>=1; H=H*H;}for(int i=0; i<=n; ++i)ans=(ans+L.a[1][i])%mod;printf("%d",ans);return 0; }
转载于:https://www.cnblogs.com/cytus/p/9600437.html
洛谷P3758/BZOJ4887 [TJOI2017] 可乐 [矩阵快速幂]相关推荐
- 洛谷P3390 【模板】矩阵快速幂
传送门 从今天开始学习矩阵快速幂.jpg 1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 #include< ...
- [TJOI2017]可乐(矩阵快速幂)
题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆.它每一秒都会随机 ...
- BZOJ4887:[TJOI2017]可乐(矩阵乘法)
Description 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且 放在了加里敦星球的1号城市上.这个可乐机器人有三种行为:停在原地,去下一个相邻的 城市,自爆. ...
- 洛谷P3758 [TJOI2017]可乐
原题链接:洛谷P3758 [TJOI2017]可乐 题目描述 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行为: ...
- 洛谷 P3758 [TJOI2017]可乐
洛谷 P3758 [TJOI2017]可乐 Description 加里敦星球的人们特别喜欢喝可乐.因而,他们的敌对星球研发出了一个可乐机器人,并且放在了加里敦星球的1号城市上.这个可乐机器人有三种行 ...
- 【洛谷P3390】 矩阵快速幂(模板)
贴一下矩阵快速幂的模板 #include<iostream> #include<cstdio> #include<cstring> #include<stri ...
- 洛谷P1939 【模板】矩阵加速(数列)
题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值. 输入格式 第一行一个整数T,表示询 ...
- 矩阵快速幂(矩阵加速)
//南昌理工ACM集训队 放心食用 矩阵加速 快速幂(前置技能) 矩阵快速幂 可乐 附个模板 最后小结 本人小白如有不对欢迎指正ლ(╹◡╹ლ) 矩阵加速 快速幂(前置技能) 对于普通的求a的b次方,一 ...
- 快速幂、矩阵快速幂、快速乘法
快速幂 快速幂是我们经常用到的一种算法,快速幂顾名思义就是快速的幂运算.我们在很多题目中都会遇到幂运算,但是在指数很大的时候,我们如果用for或者是pow就会超时,这时候就用到了快速幂. 快速幂的原理 ...
最新文章
- 日10亿级处理,基于云的微服务架构
- 教你掌握经典机器学习算法背后原理,解决代码模型参数问题!
- 解析《中国互联网软件测试行业2018年度调研报告》
- DIP原则、IoC以及DI
- ubuntu16.04安装pycharm,并设置快捷启动方式
- 合成器插件Serum 1.23b7绿化版亲测有效
- iWebOffice
- SplitContainer控件扩展之收缩面板
- ICTCLAS 汉语词性标注集 中科院
- mysql的tps是什么意思_Mysql数据库的QPS和TPS的意义和计算方法
- 家庭财务管理系统的设计与实现(Java毕业设计-Springboot)
- ParticleDesigner 粒子编辑器使用
- mysql 设置 utc_关于时间:MySQL应该将其时区设置为UTC吗?
- 《青春有你2》选手信息爬取
- golang 根据生日计算星座和属相
- Placement Rules 使用文档
- 【大数据入门核心技术-Tez】(三)Tez与Hive整合
- Web前端开发技术:实验14-16
- 硬汉内贾德:让美国人战栗(推荐)
- 00014__广州市来穗人员积分制服务管理申办指南
热门文章
- 使用 U 盘启动盘安装 Windows 7 旗舰版系统
- windows7旗舰版主蓝色海洋 Windows7主题蓝色大海
- 10月27号吃鸡服务器维护吗,10月27日正式服维护公告
- 4G LTE频带划分和国内运行商资源分配
- 初学编程,放弃C++而选择C语言,究竟选对了还是选错了?
- greenplum使用总结之常用SQL及函数
- 【转】Xamarin.Android 入门之:Xamarin+vs2015 环境搭建
- 泡沫破裂的经济学原理
- linux系统安装pe,Linux下制作Linux+WINPE启动盘装机必备:
- 计算机科学与基础 简答题,计算机科学基础习题与解析