试题编号: 201409-5
试题名称: 拼图
时间限制: 3.0s
内存限制: 256.0MB
问题描述:

问题描述
  给出一个n×m的方格图,现在要用如下L型的积木拼到这个图中,使得方格图正好被拼满,请问总共有多少种拼法。其中,方格图的每一个方格正好能放积木中的一块。积木可以任意旋转。

  
输入格式
  输入的第一行包含两个整数n, m,表示方格图的大小。
输出格式
  输出一行,表示可以放的方案数,由于方案数可能很多,所以请输出方案数除以1,000,000,007的余数。
样例输入
6 2
样例输出
4
样例说明
  四种拼法如下图所示:

  
评测用例规模与约定
  在评测时将使用10个评测用例对你的程序进行评测。
  评测用例1和2满足:1<=n<=30,m=2。
  评测用例3和4满足:1<=n, m<=6。
  评测用例5满足:1<=n<=100,1<=m<=6。
  评测用例6和7满足:1<=n<=1000,1<=m<=6。
  评测用例8、9和10满足:1<=n<=10^15,1<=m<=7。

问题链接:CCF201409-5 拼图
问题简述:(略)
问题分析:插头DP解法,参见参考链接。
程序说明:(略)
参考链接
[ACM]CCF CSP [201409-5]E题 拼图
CCF CSP 201409-5 拼图
CCF201409-5拼图(状态压缩DP+矩阵快速幂) (骨牌覆盖问题拓展 )
CCF201409-5 拼图(30分)
题记:(略)

100分的C++语言程序如下:

/* CCF201409-5 拼图 */#include <bits/stdc++.h>using namespace std;typedef long long LL;
const int MOD = 1000000007;
const int M = 7;// 矩阵快速幂
int c[1 << M][1 << M];
void mat_mul(int a[][1 << M], int b[][1 << M], int sz = 1 << M)
{memset(c, 0, sizeof c);for (int i = 0; i < sz; i++)for (int j = 0; j < sz; j++)for (int k = 0; k < sz; k++)c[i][j] = (c[i][j] + LL(a[i][k]) * b[k][j]) % MOD;for (int i = 0; i < sz; i++)for (int j = 0; j < sz; j++)a[i][j] = c[i][j];
}LL n;
int m, a[1 << M][1 << M], ans[1 << M][1 << M];inline int vacant(int s, int u)
{return u >= 0 && u < m && (s & (1 << u)) == 0;
}int setadd(int s, int u1, int u2 = -1)
{s |= 1 << u1;if (u2 != -1) s |= 1 << u2;return s;
}void search(int origin, int s1 ,int s2 = 0)
{if (s1 == (1 << m) - 1) a[origin][s2]++;else {for (int i = 0; i < m; i++)    //找到第一个没被占用的格子,然后继续搜索if (vacant(s1, i)) {          //格子i没有被占用//(1) 2 1(down)if (vacant(s1, i + 1) && vacant(s2, i + 1))search(origin, setadd(s1, i, i + 1), setadd(s2, i + 1));//(2) 2 1(up)if (vacant(s1, i + 1) && vacant(s2, i))search(origin, setadd(s1, i, i + 1), setadd(s2, i));//(3) 1 2(up)if (vacant(s2, i) && vacant(s2, i - 1))search(origin, setadd(s1, i),setadd(s2, i - 1, i));//(4) 1 2(down)if (vacant(s2, i) && vacant(s2, i + 1))search(origin, setadd(s1, i), setadd(s2, i, i + 1));break;}}
}int main()
{std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);cin >> n >> m;memset(a, 0, sizeof a);for (int S = 0; S < (1 << m); S++) search(S, S);// 矩阵初始化int sz = 1 << m;for (int i = 0; i < sz; i++)for (int j = 0; j < sz; j++)ans[i][j] = (i == j) ? 1 : 0;// 矩阵快速幂计算LL b = n - 1;while (b) {if (b & 1) mat_mul(ans, a);mat_mul(a, a);b >>= 1;}// 输出结果cout << ans[0][sz - 1] << endl;return 0;
}

CCF201409-5 拼图(100分)【插头DP+状态压缩】相关推荐

  1. DP——状态压缩dp

    状态压缩DP 蒙德里安的梦想 分析题目,当我们先摆横着放的方块,再摆放竖着放的方块,当横着放的小方块摆放完后,竖着放的方块也就确定了,因此总方案数应该等于只放横着的小方块的合法方案数.我们考虑每一列可 ...

  2. HDU 4628 Pieces(DP + 状态压缩)

    Pieces 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4628 题目大意:给定一个字符串s,如果子序列中有回文,可以一步删除掉它,求把整个序列删除 ...

  3. 洛谷1052——过河(DP+状态压缩)

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  4. 【HDU 4352】 XHXJ's LIS (数位DP+状态压缩+LIS)

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. [HDU 4842]--过河(dp+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4842 过河 Time Limit: 3000/1000 MS (Java/Others)    Mem ...

  6. AcWing 327 玉米田 题解 (动态规划—DP—状态压缩DP)

    原题传送门 #include<bits/stdc++.h>using namespace std;const int N = 14, M = 1 << 12, mod = 1e ...

  7. 【完全背包】A005_LC_贴纸拼词(dp + 状态压缩)

    我们给出了 N 种不同类型的贴纸.每个贴纸上都有一个小写的英文单词. 你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target. 如果你愿意的话,你可以不止一次地使 ...

  8. Codeforces 718E.Matvey's Birthday dp+状态压缩

    题意 给定一个长度为n的字符串,字符集大小为8.两个点i,j之间有权值为1的边需要满足以下条件至少一个 1. |i-j|=1 2. si=sj 求图的直径和多少个有序点对之间的最短路长度等于直径 N≤ ...

  9. [BZOJ2331]地板(插头DP)

    Description lxhgww的小名叫"小L",这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板 ...

最新文章

  1. 华为NPU卡ubuntu(无网络连接情况)驱动安装记录
  2. 简书mysql配置_MySQL安装配置
  3. 哈尔滨工程大学智能科学与工程学院成功举办了“一院一节“暨十二届极速挑战智能车总决赛
  4. Xcode7.2如何真机调试iOS 9.3的设备
  5. Python核心编程(第九章)--文件和输入输出
  6. discuz admin.php无法登录,忘记管理员密码无法登录Discuz后台管理员的解决方法汇总...
  7. Jeecg社区wiki在开放,终于可以在线看文档啦!!!
  8. I.MX6 make menuconfig OTG to slave only mode
  9. OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
  10. System.ArgumentException: 已添加项。字典中的关键字:“RegEx”所添加的关键字:“RegEx” 异常的解决办法...
  11. kali linux无法启动服务,不好了!出问题了!在安装Kali Linux之后启动系统时
  12. Jedis连接数据库
  13. java中访问权限控制顺序_Java中的四种访问权限控制 | 学步园
  14. 计算机打字速录,速录员打字口诀有哪些
  15. java freepascal_Free Pascal
  16. 将IDM添加到谷歌浏览器
  17. 计算机网络实用技术教程txt,计算机网络实用技术教程
  18. matlab实现多目标测试集ZDT、DTLZ、MOP的最优理论前沿
  19. 微信公众号无限推送消息微信群发微信定时群发微信主动推送微信客服消息
  20. android studio调用python_Android Studio调用python运行thensorflow模型--CLE方案实现

热门文章

  1. X25519(Curve25519)椭圆曲线密钥生成
  2. Linux下toco命令压缩Tensorflowlite模型
  3. 使用OGR2OGR将S57数据转为shp格式
  4. 开源GIS(二十)——CAD数据添加属性转GIS数据
  5. DXUT框架剖析(10)
  6. 深入Managed DirectX9
  7. table id=datatable - Requested unknown parameter 'tname' for row 0, column 4. 解决
  8. crtmpserver 配置说明_crtmpserver框架代码详解
  9. 查询Linux的公网及内网IP
  10. Linux软件包管理的知识点,Debian软件包管理APT和存储库的基础知识[Linux 101] | MOS86...