hihoCoder #1162 : 骨牌覆盖问题·三
2015-10-08 21:07
267 查看
#1162 : 骨牌覆盖问题·三
Time Limit:10000msCase Time Limit:1000ms
Memory Limit:256MB
描述
前两周里,我们讲解了2xN,3xN骨牌覆盖的问题,并且引入了两种不同的递推方法。这一次我们再加强一次题目,对于给定的K和N,我们需要去求KxN棋盘的覆盖方案数。
提示:KxN骨牌覆盖
输入
第1行:2个整数N。表示棋盘宽度为k,长度为N。2≤K≤7,1≤N≤100,000,000输出
第1行:1个整数,表示覆盖方案数 MOD 12357Sample Input
2 62247088
Sample Output
1399 解题:dfs造转移方程+dp计数+快速幂优化dp
#include <bits/stdc++.h> using namespace std; typedef long long LL; const LL mod = 12357; int n,m; struct Matrix{ int m[1<<7][1<<7]; Matrix(){ init(); } void init(){ memset(m,0,sizeof m); } Matrix operator*(const Matrix &rhs){ Matrix ret; for(int k = 0; k < (1<<n); ++k) for(int i = 0; i < (1<<n); ++i) for(int j = 0; j < (1<<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 = 0; i < 8; ++i){ for(int j = 0; j < 8; ++j) printf("%d ",m[i][j]); cout<<endl; } } }; Matrix a,b; void quickPow(LL index){ while(index){ if(index&1) a = a*b; index >>= 1; b = b*b; } } bool tab[10][10]; void dfs(int cur,int st){ if(cur >= n){ int ss = 0; for(int i = n-1; i >= 0; --i){ ss <<= 1; ss |= tab[i][1]; } b.m[st][ss]++; return; } if(!tab[cur][0]){ if(!tab[cur][1]){ tab[cur][0] = tab[cur][1] = true; dfs(cur+1,st); tab[cur][0] = tab[cur][1] = false; } if(cur + 1 < n){ if(!tab[cur+1][0]){ tab[cur+1][0] = tab[cur][0] = true; dfs(cur+2,st); tab[cur+1][0] = tab[cur][0] = false; } } }else dfs(cur + 1,st); } void init(int st){ memset(tab,false,sizeof tab); for(int i = 0,xst = st; i < n; ++i,xst >>= 1) tab[i][0] = xst&1; dfs(0,st); } int main(){ while(~scanf("%d%d",&n,&m)){ b.init(); a.init(); for(int i = 0; i < (1<<n); ++i) init(i); a.m[0][0] = 1; quickPow(m); printf("%d\n",a.m[0][0]); } return 0; }
View Code
相关文章推荐
- 剑指offer—孩子们的游戏(圆圈中最后剩下的数)
- markdown使用LaTeX语法编写数学公式
- web.xml 中的listener、 filter、servlet 加载顺序及其详解
- [置顶] 【实验-视频过程】闪回数据库Flashback database
- web.xml 中的listener、 filter、servlet 加载顺序及其详解
- iOS项目上传到AppStore步骤流程
- 值得关注的syncthing
- jquery组织结构图插件 (基于jit-yc 做可拖动、自适应伸缩的orgchart)
- 理解多线程中的join方法
- 软件工程 第二章作业
- 信息安全系统设计基础第三周学习总结 ---20135334 赵阳林
- 结对项目博客
- JavaScript+Canvas 实现网页截屏
- [算法]快排
- Angularjs的核心概念
- JAVA组件大全复选框,选项按钮,复选方框,下拉式列表的使用介绍
- 软考-信息安全
- c++ primer 学习笔记1_基本内置类型
- 理解NSUserdefaults
- 美团的android多渠道包的3种方法