蓝桥杯历届试题-垒色子(DP+矩阵快速幂)
一、题目
垒骰子
赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。
经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。
假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。
atm想计算一下有多少种不同的可能的垒骰子方式。
两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。
由于方案数可能过多,请输出模 10^9 + 7 的结果。
不要小看了 atm 的骰子数量哦~
「输入格式」
第一行两个整数 n m
n表示骰子数目
接下来 m 行,每行两个整数 a b ,表示 a 和 b 数字不能紧贴在一起。
「输出格式」
一行一个数,表示答案模 10^9 + 7 的结果。
「样例输入」
2 1
1 2
「样例输出」
544
「数据范围」
对于 30% 的数据:n <= 5
对于 60% 的数据:n <= 100
对于 100% 的数据:0 < n <= 10^9, m <= 36
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 2000ms
二、思路
假设$d[i]$表示第$n$层以数字$i$朝上的色子摆放方案数(先不考虑四周的朝向),那么,一开始,$d[] = {0, 1, 1, 1, 1, 1, 1}$。同时,还有一个矩阵$f$,$f[i][j]$表示第$n-1$层的色子以$i$朝上、第$n$层的色子以$j$朝上是否可行。也就是说,如果数字$a$和$b$冲突,那么,$f[a][op[b]] = 0$(当然,也有$f[b][op[a]]=0$);如果数字x和y不冲突,那么,$f[x][op[y]] = 1$(当然,也有$f[y][op[x]]=1$)。其中,$op[x]$表示与数字$x$对立的数字。如,$op[1] = 4$,整个$op$数组的值为:$op[] = \{0, 4, 5, 6, 1, 2, 3\}$。
由上可知(这句话其实都是忽悠人的,使语言表达起来逻辑连贯性更强而已。其实说白了就是凭感觉),
当$n = 1$时,结果为$6(6种朝上的数字) * 4(每种朝上的数字周围的数字都有4种朝向) = 24$。
当$n > 1$时,第$2$层各面朝上的方案数为:\[d = d * f * 4^2\] \[ans = \sum\limits_{i=1}^{6}d_i % 10^9+7\]
第$3$层各面朝上的方案数为:\[d = d * f^2 * 4^3\] \[ans = \sum\limits_{i=1}^{6}d_i % 10^9+7\]
……
第$n$层各面朝上的方案数为:\[d = d * f^{n-1} * 4^n\] \[ans = \sum\limits_{i=1}^{6}d_i % 10^9+7\]
所以,只要求出$f^{n-1}$和$4^n$,那么,问题就解决了。而这可以使用(矩阵)快速幂求解。
三、源代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define MOD 1000000007
typedef long long LL;
typedef vector<LL> vec1d;
typedef vector<vec1d> Matrix;
, , , , , , };
, , , , , , };
Matrix mul(Matrix& a, Matrix& b) {
Matrix c(, vec1d());
; i < a.size(); ++i) {
; j < b.size(); ++j) {
; k < b[].size(); ++k) {
c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % MOD;
}
}
}
return c;
}
Matrix mpow(Matrix a, LL x) {
Matrix res(, vec1d());
; i <= ; ++i)res[i][i] = ;
) {
)res = mul(res, a);
a = mul(a, a);
x >>= ;
}
return res;
}
LL iqow(LL a, LL x) {
LL res = ;
) {
)res = (res * a) % MOD;
a = (a * a) % MOD;
x >>= ;
}
return res;
}
int main() {
#ifndef ONLINE_JUDGE
//freopen("input.txt", "r", stdin);
//freopen("output2.txt", "w", stdout);
#endif // ONLINE_JUDGE
LL n, m, a, b;
scanf("%I64d%I64d", &n, &m);
Matrix f(, vec1d());
; i <= ; ++i); j <= ; ++j)f[i][j] = ;
; i < m; ++i) {
scanf("%I64d%I64d", &a, &b);
f[a][op[b]] = , f[b][op[a]] = ;
}
)printf("24\n");
else {
f = mpow(f, n - );
LL ans = ;
; i <= ; ++i)ans = (accumulate(f[i].begin() + , f[i].end(), 0LL) + ans) % MOD;
printf(, n)) % MOD);
}
;
}
蓝桥杯历届试题-垒色子(DP+矩阵快速幂)的更多相关文章
- 转 蓝桥杯 历届试题 波动数列 [ dp ]
传送门 历届试题 波动数列 时间限制:1.0s 内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个 ...
- 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...
- bnuoj 34985 Elegant String DP+矩阵快速幂
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...
- HDU 5434 Peace small elephant 状压dp+矩阵快速幂
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant Accepts: 38 Submissions: ...
- 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂
[题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*
BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...
- Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】
题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...
- codeforces E. Okabe and El Psy Kongroo(dp+矩阵快速幂)
题目链接:http://codeforces.com/contest/821/problem/E 题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y- ...
随机推荐
- QT 正则表达式无效
背景:写了一个判断IP地址合法的正则表达式,并让它应用在输入框中 代码如下 QRegExp rx_ip("^((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}( ...
- requestWindowFeature()的应用
android开发中经常会在setContentView(R.layout.XXX); 前设置requestWindowFeature(XXXX). 他的意思是需要软件全屏显示.自定义标题(使用按钮等 ...
- php 获取某个日期n天之后的日期
<?php $date=date_create("2013-03-15"); date_add($date,date_interval_create_from_date_st ...
- Java IO流-合并流
2017-11-05 20:15:28 SequenceinputStream SequenceinputStream:SequenceInputStream 表示其他输入流的逻辑串联.它从输入流的有 ...
- Linux命令详解-man
man 命令提供有关主题的参考信息,例如命令.子例程和文件.man 命令提供由名称指定的对命令的单行描述.man 命令也提供所有命令的信息,这些命令的描述包含用户指定的关键字集合. 1.命令格式: m ...
- torchnet package (1)
torchnet package (1) torchnet torchnet torchnet是用于torch的代码复用和模块化编程的框架,主要包含四个类 Dataset 以不同的方式对数据进行预处理 ...
- UVA-1605 Building for UN (构造)
题目大意:n个国家的人要在一栋大厦里办公,要求任意两个国家的办公室要相邻(同层同边或邻层同面),设计一个满足要求的方案. 题目分析:题目限制较少,任意构造出一个解即可. 代码如下: # include ...
- 本人遇到的spring事务之UnexpectedRollbackException异常解决笔记
本人最近在使用spring事务管理的过程中遇到如下异常,导致服务端抛出500给前端,让搞前端的哥们抱怨我心里着实不爽,前前后后折腾了近半个小时才得于解决,今天就做个笔记,以免日后又犯这个错误.好了,错 ...
- MySQL_explain关键字分析查询语句
版权声明:本文为博主原创文章,转载请注明出处. 通过对查询语句的分析,可以了解查询语句的执行情况.MySQL中,可以使用EXPLAIN语句和DESCRIBE语句来分析查询语句. EXPLAIN语句的基 ...
- [转载]字符串匹配的KMP算法
作者: 阮一峰 日期: 2013年5月 1日 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另 ...