题意:有一个k*n的棋盘,要求用1*2的骨牌来铺满,有多少种方案?(k<8,n<100000001)

思路:

  由于k是比较小,但是又不那么小,可以专门构造这样的一个矩阵M,使得只要我们有一个初始矩阵R,求得ans矩阵,然后答案就在ans中了。ans=R*Mn

  M的大小应该是2k*2k,所以当k稍微大一些就不合适存储这个矩阵了,而且里面大部分都是0,很浪费。由于k<8,所以M的大小为128*128是可以接受的。复杂度是O(23*k*logn),大概是千万级别的。

 #include <bits/stdc++.h>
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=;
const int mod=;
int k, n;
int M[][], grid[][], tot[][], cur[][]; void DFS(int x,int y,int col) //构造矩阵M。
{
if(col==k)
{
M[y][x]=; //表示y可以转移到x
return ;
}
DFS(x<<, (y<<)+, col+); //不放
DFS((x<<)+, y<<, col+); //放竖
if(col+<=k) DFS((x<<)+, (y<<)+, col+); //放横
} void mul(int A[][],int B[][])
{
for(int i=; i<(<<k); i++)
{
for(int j=; j<(<<k); j++)
{
int tmp=;
for(int q=; q<(<<k); q++)
{
tmp+=A[i][q]*B[q][j];
tmp%=mod;
}
grid[i][j]=tmp;
}
}
memcpy(A, grid, sizeof(grid));
} int cal(int t) //注意t=n-1
{
memset(M, , sizeof(M));
memset(tot, , sizeof(tot) );
memset(cur, , sizeof(cur) );
DFS( , , ); //求矩阵。
memcpy(cur, M, sizeof(M));
while(t)
{
if(t&) mul(M, cur); //该位为1
mul(cur, cur); //矩阵自乘
t>>=;
}
return M[(<<k)-][(<<k)-]; //矩阵很特殊,只需要这一项。
} int main()
{
//freopen("input.txt", "r", stdin);
while(~scanf("%d%d", &k, &n)) printf("%d\n", cal(n-));
return ;
}

AC代码

最新文章

  1. Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译
  2. 动态设置AndroidManifest.xml文件中的meta-data
  3. Docker部署Hadoop集群
  4. 浏览器 私有属性&amp;内核
  5. chrome浏览器首页被hao123劫持解决办法
  6. 使用NPOI完成导出Excel文件
  7. cocos2d-x 判断系统语言
  8. 复制pdf文字出来是乱码的一种可能的解决方案
  9. vim下如何删除某行之后的所有行
  10. 3D空间包围球(Bounding Sphere)的求法
  11. css3 变换 transform(2D)
  12. C++拷贝构造函数专题
  13. 基于python的统计公报关键数据爬取
  14. ubuntu下Qt链接MySQL: QMYSQL driver not loaded(不用重新编译源码)
  15. Golang实现九九乘法表
  16. Jenkins知识地图
  17. 反射, getClass(), 和something.class以及类型类(转)
  18. cesium随笔 — 获取当前鼠标的经度、纬度、高度
  19. 【转载】D3D深度测试和Alpha混合
  20. Node.js系列——(2)发起get/post请求

热门文章

  1. JAVA NIO non-blocking模式实现高并发服务器
  2. Qt Creator Theme FlatDark 配色
  3. 3 手写Java HashMap核心源码
  4. Lightoj1028 【数学-乘法原理】
  5. Unity UGUI鼠标穿透UI问题(Unity官方的解决方法)
  6. Unity NGUI学习
  7. 常用的高级sql查询
  8. [Xcode 实际操作]九、实用进阶-(31)为IAP(支付方式)内购功能的具体实现和测试
  9. 【OpenJ_Bailian - 4005】拼点游戏(贪心)
  10. 字符串最小表示初探 By cellur925