题解:Luogu-P8624 [蓝桥杯 2015 省 AB] 垒骰子
复习了一遍矩阵快速幂,感谢 @naroto2022 的讲课和分享的好题。
本题是一道动态规划结合矩阵加速的好题。
读完题考虑设计状态,记 \(f_{i,j}\) 为第 \(i\) 个骰子点数 \(j\) 朝上时的方案数,则初步得出转移方程为 \(f_{i,j} = \sum_{k = 1}^{6}f_{i-1,k}\times 4\)(乘上 \(4\) 是因为侧面翻转有 \(4\) 种情况)。
接下来对题目中给出的约束条件进行思考,不妨标记一个二维数组 \(to\) 来保存每个限制。当 \(to_{u,v}\) 为 \(0\) 时,方案舍去;否则就维持原状。再标记一个 \(opp\) 数组,标记每个点数的对面点数。于是得出进一步的转移方程为 \(f_{i,j}=\sum_{k=1}^{6}f_{i-1,k}\times4\times to_{opp_j,k}\)。
此时已经接近正解了,但转移复杂度为 \(O(36n)\),无法接受,于是考虑使用矩阵加速。
由于转移过程与 \(i\) 无关,所以考虑矩阵加速转移,记 \(mp_{i,j}\) 为上一个骰子 \(i\) 点数朝上,当前骰子 \(j\) 点数朝上的方案数,这样就可以以 \(O(6^3logn)\) 的复杂度通过本题。
接下来是参考代码。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M=40,N=1e9+5,P=1e9+7;
int n,m;
int opp[7]={0,4,5,6,1,2,3};
bool to[7][7];
struct JZ {
int mp[7][7];
JZ() {
memset(mp,0,sizeof mp);
}
}a,ans;
JZ operator*(const JZ &x,const JZ &y) {
JZ z;
for(int k=1;k<=6;k++){
for(int i=1;i<=6;i++){
for(int j=1;j<=6;j++){
z.mp[i][j]=(z.mp[i][j]+x.mp[i][k]*y.mp[k][j]%P)%P;
}
}
}
return z;
}//矩阵基本操作
void qpow(int k) {
//答案矩阵预处理
for(int i=1;i<=6;i++)ans.mp[1][i]=4;
//答案矩阵第一行赋初始值4,因为第一个骰子可以放任意位置
//常数矩阵a预处理
for(int i=1;i<=6;i++){
for(int j=1;j<=6;j++){
if(to[i][opp[j]])a.mp[i][j]=0;//不合法,舍去
else a.mp[i][j]=4;//否则合法
}
}
while(k){
if(k&1)ans=ans*a;
a=a*a;
k>>=1;
}//矩阵快速幂转移计算答案
return;
}
signed main() {
cin.tie(0)->sync_with_stdio(0);cout.tie(0);
cin>>n>>m;
while(m--){
int u,v;
cin>>u>>v;
to[u][v]=1,to[v][u]=1;
//这里的to数组为了方便,与上述的标记意义相反,1为舍去
}
qpow(n-1);
int res=0;
for(int i=1;i<=6;i++){
res=(res+ans.mp[1][i]%P)%P;
}//所得矩阵第一行元素之和即为答案
cout<<res;
return 0;
}
如有不足,还请指出,感谢大家观看!
题解:Luogu-P8624 [蓝桥杯 2015 省 AB] 垒骰子的更多相关文章
- [蓝桥杯]2015蓝桥省赛B组题目及详解
/*——————————————————————————————————————————————————————————— [结果填空题]T1 题目:奖券数目 有些人很迷信数字,比如带“4”的数字,认 ...
- 蓝桥杯2015年省赛C/C++大学B组
1. 奖券数目 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其 ...
- [蓝桥杯][2015年第六届真题]机器人塔(dfs)
题目描述 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似: A B B A B A A A B B B B B A B A B A B ...
- [蓝桥杯2015决赛]四阶幻方(DFS + 剪枝)
题目描述 把1~16的数字填入4x4的方格中,使得行.列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方. 四阶幻方可能有很多方案.如果固定左上角为1,请计算一共有多少种方案. 比如: 1 ...
- 蓝桥杯 2015年省赛最后一题 生命之树(树形dp)
题目描述: 生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值.上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点 ...
- [蓝桥杯2015决赛]穿越雷区(BFS求最短路)
题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废.某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?已 ...
- [蓝桥杯2015初赛]生命之树(树状dp)
在X森林里,上帝创建了生命之树.他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值.上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都存在一个点列 ...
- [蓝桥杯2015初赛]方程整数解 unordered_map
unordered_map: 如果直接写报错加上tr1: #include<tr1/unordered_map>//注意写法 using namespace std; using name ...
- 2016年蓝桥杯B组C/C++决赛题解
2016年第七届蓝桥杯B组C/C++决赛题解 2016年蓝桥杯B组C/C++决赛题目(不含答案) 1.一步之遥 枚举解方程,或者套模板解线性方程 #include<bits/stdc++.h&g ...
- 蓝桥杯 带分数 DFS应用
问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
随机推荐
- 企业级开源CMS新标杆,三分钟搭建多语言官网!
HuoCMS是基于ThinkPHP6和Vue3研发的现代化内容管理系统,专为中小企业及开发者打造全场景数字化解决方案.系统采用MIT开源协议,支持多语言.多终端适配,内置可视化编辑器与SEO优化体系, ...
- 工具 | StarCodeSecurity
0x00 简介 StarCodeSecurity是一款图形化的代码审计工具. 下载地址: StarCodeSecurity下载:StarCodeSecurity下载 0x01 功能说明 支持对规则进行 ...
- Java 数据库开发总结
数据库连接.设计以及备份技巧集锦 JDBC操作各种数据库经验技巧集萃 Java 数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成.JDBC 为工具/数据库开发人员提供了一个标准的 ...
- HarmonyOS NEXT开发实战教程--招聘app
这一周忙到起飞,只能在周末发个文章.今天的内容比较简单,是一个招聘app,适合新手友友参考,大佬们可以直接忽略. 看一下效果图: 这是一个比较常见的应用,大家做这类应用建议大家先分析一下应用和页面的结 ...
- ISO镜像做yum源
先上传一个镜像文件 centos-7-x86-1708.iso 挂载 mount -o loop /root/centos-7-x86-1708.iso /file 设置开机自动挂载 vi /etc/ ...
- 神经网络-反向传播BP算法推导
还是用前向算法的图, 然后仔细一看分类输出, 发现好像错了, 这该如何去反向修改权值呢? 因其是网络结构, 改变一点, 必然会引起一连串的改动, 这个过程, 如何来描述呢? 数学推导 声明变量 首先, ...
- C# 之静态构造器与静态字段初始化器
public class Test { /// <summary> /// 静态字段初始化器会在调用静态构造器前运行. /// 如果类型没有静态构造器,字段会在类型被使用前或运行时中更早的 ...
- 5 easybr指纹浏览器内存修改教程
目的 navigator.deviceMemory可以暴露设备的物理内存和运行状态,被用于设备唯一性识别或判断设备等级. 通过伪造这类信息,可以增强防关联.防追踪能力. easybr指纹浏览器提供演示 ...
- JAVA 循环删除list中元素的方法总结
摘要:介绍List集合实现元素边遍历边删除的方法,例如removeIf和迭代器iterator.remove()等. 综述 List集合是我们开发中经常使用到的一种集合形式,有时候会遇到在遍历Li ...
- Java面试|BIO、NIO、AIO的区别和应用场景
摘要:BIO是一个连接一个线程,NIO是一个请求一个线程,AIO是一个有效请求一个线程. 在学习Java I/O类库时,容易混淆NIO.BIO.AIO这几个概念,同时对于阻塞和非阻塞.同步和异步的 ...