hihoCoder #1162 : 骨牌覆盖问题·三
#1162 : 骨牌覆盖问题·三
描述
前两周里,我们讲解了2xN,3xN骨牌覆盖的问题,并且引入了两种不同的递推方法。
这一次我们再加强一次题目,对于给定的K和N,我们需要去求KxN棋盘的覆盖方案数。
输入
第1行:2个整数N。表示棋盘宽度为k,长度为N。2≤K≤7,1≤N≤100,000,000
输出
第1行:1个整数,表示覆盖方案数 MOD 12357
- Sample Input
-
2 62247088
- Sample Output
-
1399 解题:dfs造转移方程+dp计数+快速幂优化dp
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod = ;
int n,m;
struct Matrix{
int m[<<][<<];
Matrix(){
init();
}
void init(){
memset(m,,sizeof m);
}
Matrix operator*(const Matrix &rhs){
Matrix ret;
for(int k = ; k < (<<n); ++k)
for(int i = ; i < (<<n); ++i)
for(int j = ; j < (<<n); ++j)
ret.m[i][j] = (ret.m[i][j] + m[i][k]*rhs.m[k][j])%mod;
return ret;
}
void print(){
for(int i = ; i < ; ++i){
for(int j = ; j < ; ++j)
printf("%d ",m[i][j]);
cout<<endl;
}
}
};
Matrix a,b;
void quickPow(LL index){
while(index){
if(index&) a = a*b;
index >>= ;
b = b*b;
}
}
bool tab[][];
void dfs(int cur,int st){
if(cur >= n){
int ss = ;
for(int i = n-; i >= ; --i){
ss <<= ;
ss |= tab[i][];
}
b.m[st][ss]++;
return;
}
if(!tab[cur][]){
if(!tab[cur][]){
tab[cur][] = tab[cur][] = true;
dfs(cur+,st);
tab[cur][] = tab[cur][] = false;
}
if(cur + < n){
if(!tab[cur+][]){
tab[cur+][] = tab[cur][] = true;
dfs(cur+,st);
tab[cur+][] = tab[cur][] = false;
}
}
}else dfs(cur + ,st);
}
void init(int st){
memset(tab,false,sizeof tab);
for(int i = ,xst = st; i < n; ++i,xst >>= )
tab[i][] = xst&;
dfs(,st);
}
int main(){
while(~scanf("%d%d",&n,&m)){
b.init();
a.init();
for(int i = ; i < (<<n); ++i) init(i);
a.m[][] = ;
quickPow(m);
printf("%d\n",a.m[][]);
}
return ;
}
hihoCoder #1162 : 骨牌覆盖问题·三的更多相关文章
- hihoCoder #1162 : 骨牌覆盖问题·三 (矩阵快速幂,DP)
题意:有一个k*n的棋盘,要求用1*2的骨牌来铺满,有多少种方案?(k<8,n<100000001) 思路: 由于k是比较小,但是又不那么小,可以专门构造这样的一个矩阵M,使得只要我们有一 ...
- hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)
[题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形 ...
- hihoCoder #1143 : 骨牌覆盖问题·一
#1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题:我们有一个2xN的长条形棋盘,然 ...
- hihoCoder #1143 : 骨牌覆盖问题·一(矩阵乘法)
1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形棋盘,然 ...
- hihoCoder #1143 : 骨牌覆盖问题·一 (斐波那契数列)
题意:我们有一个2xN的长条形棋盘,然后用1x2的骨牌去覆盖整个棋盘.对于这个棋盘,一共有多少种不同的覆盖方法呢? 思路:这是斐波那契数列啊,f[n] = f[n-1] + f[n-2],初始时 f[ ...
- hihoCoder #1151 : 骨牌覆盖问题·二 (矩阵快速幂,DP)
题意:给一个3*n的矩阵,要求用1*2的骨牌来填满,有多少种方案? 思路: 官网题解用的仍然是矩阵快速幂的方式.复杂度O(logn*83). 这样做需要构造一个23*23的矩阵,这个矩阵自乘n-1次, ...
- 骨牌覆盖问题总结!hihoCoder/ NYOJ-1273宣传墙1151
本想着做一下第九届河南省省赛题,结果被这个类似骨牌覆盖的题卡住了,队友然我去hihoCoder上老老实实把骨牌覆盖一.二.三做完,这题就没什么问题了.虽然很不情愿,但还是去见识了一下. 骨牌覆盖问题 ...
- hihocoder #1162 矩阵加速dp
#1162 : 骨牌覆盖问题·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 前两周里,我们讲解了2xN,3xN骨牌覆盖的问题,并且引入了两种不同的递推方法.这一次我 ...
- hihocoder第42周 3*N骨牌覆盖(状态dp+矩阵快速幂)
http://hihocoder.com/contest/hiho42/problem/1 给定一个n,问我们3*n的矩阵有多少种覆盖的方法 第41周做的骨牌覆盖是2*n的,状态转移方程是dp[i] ...
随机推荐
- 排序sort与qsort
首先看sort函数见下表: 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 par ...
- 题解报告:hdu 2709 Sumsets
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2709 Problem Description Farmer John commanded his co ...
- Service官方教程(4)两种Service的生命周期函数
Managing the Lifecycle of a Service The lifecycle of a service is much simpler than that of an activ ...
- HTTP协议 之 缓存
转自: http://www.cnblogs.com/TankXiao/archive/2012/11/28/2793365.html HTTP协议提供了非常强大的缓存机制, 了解这些缓存机制,对提 ...
- PHP 简单答题系统
--sample 1: <!DOCTYPE html><html><head> <title>登录</title> <style ty ...
- 208 Implement Trie (Prefix Tree) 字典树(前缀树)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个方法.注意:你可以假设所有的输入都是小写字母 a-z.详见:https://leetcode.co ...
- 求指教--hadoop2.4.1集群搭建及管理遇到的问题
集群规划: 主机名 IP 安装的软件 运行的进程 hadooop 192.168.1.69 jdk.hadoop NameNode.DFSZKFailoverController(zkfc) hado ...
- 等待进程结束函数中的BUG
偶然发现一个BUG,有一个函数是这样写的: void WaitProcExit(DWORD dwPid) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACC ...
- 置换测试: Mock, Stub 和其他
简介 在理想情况下,你所做的所有测试都是能应对你实际代码的高级测试.例如,UI 测试将模拟实际的用户输入(Klaas 在他的文章中有讨论)等等.实但际上,这并非永远都是个好主意.为每个测试用例都访问一 ...
- [BZOJ1005][HNOI2008]明明的烦恼 数学+prufer序列+高精度
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int N; ...