HDU 6185 Covering
矩阵快速幂。
一开始的思路是$dfs$出一个矩阵,$k[i][j]$表示这一行是状态$i$,将这一行填满,下一行是$j$状态的方案数。然后就可以矩阵快速幂了,但是矩阵大小是$16*16$的,超时了......
仔细观察后会发现,第$0$行状态为$0$,因此往后填充的过程中,并不会出现16种情况,只会在6种状态之间转移:$0000$,$1111$,$1100$,$0011$,$0110$,$1001$。那么只要构造$6*6$的矩阵就可以了。
#include<bits/stdc++.h>
using namespace std; const int mod = 1e9 + 7;
int k[6][6];
long long n;
map<long long ,int> ans;
struct M {
int r;
int c;
int a[6][6];
}; M mul(const M &a, const M &b) {
M res;
res.r = a.r;
res.c = b.c;
memset(res.a, 0, sizeof res.a);
for(int j = 0; j < res.c; j ++) {
for(int k = 0; k < a.c ; k ++) {
if(b.a[k][j] == 0) continue;
for(int i = 0; i < res.r; i ++) {
long long u = (long long)a.a[i][k] * (long long)b.a[k][j] % (long long)mod;
res.a[i][j] = (res.a[i][j] + (int)u) % mod;
}
}
}
return res;
} void init() {
memset(k, 0, sizeof k);
/*
0 | 0000
1 | 1111
2 | 1100
3 | 0011
4 | 0110
5 | 1001
*/
k[0][0] ++;
k[0][1] ++;
k[0][2] ++;
k[0][3] ++;
k[0][5] ++; k[1][0] ++; k[2][0] ++;
k[2][3] ++; k[3][0] ++;
k[3][2] ++; k[4][5] ++; k[5][4] ++;
k[5][0] ++;
} void work(long long p) {
M a;
memset(a.a, 0, sizeof a.a);
a.r = 6;
a.c = 6;
for(int i = 0; i < 6; i ++) {
a.a[i][i] = 1;
} M b;
b.r = 6;
b.c = 6;
for(int i = 0; i < 6; i ++) {
for(int j = 0; j < 6; j ++) {
b.a[i][j] = k[i][j];
}
} M c;
memset(c.a, 0, sizeof c.a);
c.r = 1;
c.c = 6;
c.a[0][0] = 1; while(p) {
if(p & 1) {
p --;
a = mul(a, b);
}
p = p >> 1;
b = mul(b, b);
} c = mul(c, a);
ans[p] = c.a[0][0];
printf("%d\n", c.a[0][0]);
} int main() {
init();
while(~scanf("%lld", &n)) {
work(n);
}
return 0;
}
HDU 6185 Covering的更多相关文章
- HDU 6185 Covering 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6185 题意:用 1 * 2 的小长方形完全覆盖 4 * n的矩形有多少方案. 解法:小范围是一个经典题 ...
- HDU - 6185 Covering(暴搜+递推+矩阵快速幂)
Covering Bob's school has a big playground, boys and girls always play games here after school. To p ...
- HDU - 6185 :Covering(矩阵乘法&状态压缩)
Bob's school has a big playground, boys and girls always play games here after school. To protect bo ...
- hdu 6185 递推+【矩阵快速幂】
<题目链接> <转载于 >>> > 题目大意: 让你用1*2规格的地毯去铺4*n规格的地面,告诉你n,问有多少种不同的方案使得地面恰好被铺满且地毯不重叠.答案 ...
- HDU 6185(打表代码
/** @xigua */ #include <cstdio> #include <cmath> #include <iostream> #include < ...
- hdu 6185 递推+矩阵快速幂
思路:考虑全部铺满时,前2列的放法.有如下5种情况:(转自http://blog.csdn.net/elbadaernu/article/details/77825979 写的很详细 膜一下) 假设 ...
- HDU 2295 Radar (重复覆盖)
Radar Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- POJ 3831 & HDU 3264 Open-air shopping malls(几何)
题目链接: POJ:id=3831" target="_blank">http://poj.org/problem?id=3831 HDU:http://acm.h ...
- HDU 1565:方格取数(1)(最大点权独立集)***
http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意:中文. 思路:一个棋盘,要使得相邻的点不能同时选,问最大和是多少,这个问题就是最大点权独立集. 可以 ...
随机推荐
- Tensorboard教程:显示计算图中节点信息
Tensorboard显示计算图节点信息 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 强烈推荐Tensorflow实战Google深度学习框架 实验平台: Tensorflow1 ...
- 《Apache HttpClient 4.3开发指南》
转载自:http://blog.csdn.net/chszs/article/details/16854747 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chs ...
- LintCode 391: Count Of Airplanes
LintCode 391: Count Of Airplanes 题目描述 给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机? 样例 对于每架飞机的起 ...
- 【专题】数位DP
[资料] ★记忆化搜索:数位dp总结 之 从入门到模板 by wust_wenhao 论文:浅谈数位类统计问题 数位计数问题解法研究 [记忆化搜索] 数位:数字从低位到高位依次为0~len-1. 高位 ...
- 数组B - 我想我需要一艘船屋
[题目大意]弗雷德先生正在考虑在路易斯安娜州买一块地造房子,在土地调查中,他了解到由于密西西比河的侵蚀,路易斯安那州正以每年50平方英里的速度变小.弗雷德先生想知道他买的那块地是否会被侵蚀掉,经过进一 ...
- LintCode之二叉树的最大节点
分治问题,可以把整棵树看做是由一颗颗只有三个节点组成的小树,一颗树的构成是根节点.左子树.右子树,这样只需要从左子树找出一个最大的节点,从右子树找出一个最大的节点,然后与根节点三个取个最大的,就是最终 ...
- Vue SPA 首屏加载优化实践
写在前面 本文记录笔者在Vue SPA项目首屏加载优化过程中遇到的一些坑及优化方案! 我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui ...
- Android SDK的安装与环境变量的配置
配置Andriod环境变量前提是要先安装好JAVA环境 1.下载Android SDK,点击安装,放在任意不含空格.特殊符号和中文的路径即可. 2.默认路径安装后,安装完成,开始配置环境变量. 3.打 ...
- 74.VS2013和opencv3.1.0安装教程
一.先下载文件 1.VS2013 VS2013有很多版本,专业版,旗舰版,中文英文之类的,所对应的密钥也不一样.我选择的是简体中文专业版.下载链接如下. http://www.musnow.com/t ...
- Java线上应用故障排查之一:高CPU占用【转】
近期java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下. 方法一: 转载:http://www.linuxhot.com/java-cpu-used-high.htm ...