矩阵快速幂。

一开始的思路是$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的更多相关文章

  1. HDU 6185 Covering 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6185 题意:用 1 * 2 的小长方形完全覆盖 4 * n的矩形有多少方案. 解法:小范围是一个经典题 ...

  2. HDU - 6185 Covering(暴搜+递推+矩阵快速幂)

    Covering Bob's school has a big playground, boys and girls always play games here after school. To p ...

  3. HDU - 6185 :Covering(矩阵乘法&状态压缩)

    Bob's school has a big playground, boys and girls always play games here after school. To protect bo ...

  4. hdu 6185 递推+【矩阵快速幂】

    <题目链接> <转载于 >>> > 题目大意: 让你用1*2规格的地毯去铺4*n规格的地面,告诉你n,问有多少种不同的方案使得地面恰好被铺满且地毯不重叠.答案 ...

  5. HDU 6185(打表代码

    /** @xigua */ #include <cstdio> #include <cmath> #include <iostream> #include < ...

  6. hdu 6185 递推+矩阵快速幂

    思路:考虑全部铺满时,前2列的放法.有如下5种情况:(转自http://blog.csdn.net/elbadaernu/article/details/77825979 写的很详细 膜一下)  假设 ...

  7. HDU 2295 Radar (重复覆盖)

    Radar Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  8. POJ 3831 &amp; HDU 3264 Open-air shopping malls(几何)

    题目链接: POJ:id=3831" target="_blank">http://poj.org/problem?id=3831 HDU:http://acm.h ...

  9. HDU 1565:方格取数(1)(最大点权独立集)***

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意:中文. 思路:一个棋盘,要使得相邻的点不能同时选,问最大和是多少,这个问题就是最大点权独立集. 可以 ...

随机推荐

  1. 解决vue路由与锚点冲突

    传统的锚点定位会与vue-router中的路由设置存在冲突,解决方法自定义锚点跳转: html: <ul> <li><a href="" @click ...

  2. springsecurity 表达式一览

    表达式 描述 hasRole([role]) 当前用户是否拥有指定角色. hasAnyRole([role1,role2]) 多个角色是一个以逗号进行分隔的字符串.如果当前用户拥有指定角色中的任意一个 ...

  3. CF844 C 置换 水

    由于每个数字只出现一次,离散化一下,置换求个循环节就好了. /** @Date : 2017-08-25 01:39:39 * @FileName: C.cpp * @Platform: Window ...

  4. 七牛云 PHP SDK服务器鉴权失败!参数解释

    昨天搞了一下午,用7牛官方的SDK demo 1.上传凭证 $policy = array( 'callbackUrl' => 'http://api.example.com/qiniu/upl ...

  5. 使用 pjax 载入的新页面,新页面上 类方法 无法被触发?

    在父页面上有定义类似 $(".class").click(function(){ ... }) 经过pjax 载入后的新页面 点击后没有触发事件 在segmentfault 上提问 ...

  6. CDN基础详解

    什么是 CDN?     Origin Server: 源站,也就是做 CDN 之前的客户真正的服务器;   User: 访问者,也就是要访问网站的网民;   Edge Server: CDN 的服务 ...

  7. 删除none的images

    脚本 #!/bin/bash docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop docker p ...

  8. 技巧之如何快速使用websocket来监控标准输出

    为啥是Websocket 服务端可以主动推送消息到浏览器端.比如服务端实时在打印日志,这是一个标准输出,可以实时将日志推送到浏览器. 为啥用websocketd (https://github.com ...

  9. perl6正则 2: 字母,数字,空格,下划线, 字符集

    数字, 字母, 下划线 在perl6中, 如果是 数字, 字母, 下划线, 在正则里可以正接写上. > so / True > so 'perl6_' ~~ /_/ True > 非 ...

  10. python基础===用9种方式生成新的对象

    class Point: def __init__(self, x, y): self.x = x self.y = y point1 = Point(1, 2) point2 = eval(&quo ...