题目链接:http://codeforces.com/gym/101635/attachments

题目大意:

  给出一个 \(N \times M\) 的网格图,请你用 \(1 \times 1\) 和 \(1 \times 2\) 两种纸片填满该图,问有几种方案。

知识点:  矩阵快速幂、DFS

解题思路:

  做这道题如果没有思路的话,建议先看看 \(Matrix67\) 的这篇文章。这道题就是其中的经典题目九的变形。

  由于列数很少,所以我们可以利用列与列之间的状态转移。

  设矩阵 \(Mat[state1][state2]\),其代表填满当前列(当前列的初始状态为\(state1\))并且使得下一列状态为 \(state2\) 的方案数(每一列的状态无非就是这一列哪些格子已经被填,哪些还没被填,我们可以用一个二进制数来表示状态)。

  如此一来,我们就可以先用 \(dfs\) 来求出从第一列的各种状态转移到第二列的各种状态的方案数,然后求出 \(Mat\) 的 \(M\) 次幂 \(ans\) ,答案即为 \(ans[0][0]\).

AC代码:

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9;
struct Matrix {
int mat[][];
};
Matrix Multiply(Matrix x, Matrix y, int n) {
Matrix temp;
memset(temp.mat, , sizeof(temp.mat));
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
for (int k = ; k < n; k++) {
ll tmp=(ll)x.mat[i][k] * y.mat[k][j]%mod;
temp.mat[i][j] = (int)(((ll)temp.mat[i][j]+tmp)%mod);
}
}
}
return temp;
}
Matrix Fast_Power(Matrix a, ll m, int n) {
Matrix res;
memset(res.mat, , sizeof(res.mat));
for (int i = ; i < n; i++) res.mat[i][i] = ; while (m) {
if (m & ) res = Multiply(res, a, n);
m >>= ;
a = Multiply(a, a, n);
}
return res;
} Matrix ans;
void dfs(int org,int now,int nex,int n){
int one[],two[];
memset(one,,sizeof(one));
memset(two,,sizeof(two));
int tnex=nex,tnow=now;
int ind=;
while(now){
one[ind]=now%;
now>>=;
ind++;
}
bool flag=true;
for(int i=;i<n;i++){
if(one[i]!=){
flag=false;
break;
}
} if(flag){
ans.mat[org][tnex]++;
return;
}
ind=;
while(nex){
two[ind]=nex%;
nex>>=;
ind++;
} for(int i=;i<n;i++){
if(one[i]==){
dfs(org,tnow+(<<i),tnex,n);
dfs(org,tnow+(<<i),tnex|(<<i),n);
if(i+<n&&one[i+]==){
dfs(org,tnow+(<<i)+(<<(i+)),tnex,n);
}//为了避免重复,我们不在下一列放置 2*1 的纸片
break;
}
}
}
int main(){
// freopen("in.txt","r",stdin);
int N;
ll M;
scanf("%d%lld",&N,&M);
for(int i=;i<(<<N);i++)
dfs(i,i,,N);
ans=Fast_Power(ans,M,(<<N));
printf("%d\n",ans.mat[][]);
return ;
}

Gym101635C Macarons的更多相关文章

  1. Echarts3 关系图-力导向布局图

    因为项目需要,要求实现类似力导图效果的图,我就瞄上了echarts. 注意事项1:由于我的项目要部署到内网,所以js文件要在本地,网上大多力导图都是echarts2的,而其又依赖zrender基础库, ...

  2. 开源库Magicodes.ECharts使用教程

    目录 1    概要    2 2    Magicodes.ECharts工作原理    3 2.1    架构说明    3 2.1.1    Axis    4 2.1.2    CommonD ...

  3. Echars详解

    简介 ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器(IE6/7/8/9 /1 ...

  4. Echarts的基本用法

    首先需要到导入echatrs.js文件 <script src="dist/echarts.js"></script> 路径配置 require.confi ...

  5. The 10 best sweet treats in Singapore

    Every time I walk out of Changi airport's air-conditioning into the humid outdoors, there's a sweet ...

  6. ECharts切换主题

    初始化接口,返回ECharts实例,其中dom为图表所在节点,theme为可选的主题,内置主题('macarons', 'infographic')直接传入名称,自定义扩展主题可传入主题对象.如: v ...

  7. Echarts个人实例

    1.deviceOperateTrendIndex.jsp <%@ page language="java" contentType="text/html; cha ...

  8. Echart多图联动

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  9. Echarts折线图表断点如何补全

    Echarts折线图如何补全断点以及如何隐藏断点的title 做报表的时候,尤其是做图表的时候时常会碰到某一记录的值中缺少某个时间段(比如月份或季度)的值,导致图表显示残缺不全,for example ...

随机推荐

  1. FluentAspects -- 基于 Fluent API 的 Aop

    FluentAspects -- 基于 Fluent API 的 Aop Intro 上次我们做了一个简单的 AOP 实现示例,但是实现起来主要是基于 Attribute 来做的,对于代码的侵入性太强 ...

  2. telnet 636端口不通

    今天发生了一件奇怪的事情,LDAP的636端口突然就不通了报错如下 [www@DC ~]$ telnet 10.219.90.173 636Trying10.219.90.173...Connecte ...

  3. 字符串后面空字符的问题(char*与string的转换)

    今天AC了不少题,困扰已久的Time limit error 也解决了,记住下次用STL容器的时候一定要清空容器. 其次是字符数组与字符串的浅谈. 字符数组是以'\0'结尾的,所以在字符数组赋值给字符 ...

  4. 数学--数论--HDU 6128 Inverse of sum (公式推导论)

    Description 给nn个小于pp的非负整数a1,-,na1,-,n,问有多少对(i,j)(1≤i<j≤n)(i,j)(1≤i<j≤n)模pp在意义下满足1ai+aj≡1ai+1aj ...

  5. pytho xlrd简介

    xlrd:是什么? xlrd是python的一个模块,主要用来对Excel进行读的操作,相对应的,xlwd就是对Excel进行写的模块了. xlrd中有哪些方法可以用呢? 1.打开Excel文件读取数 ...

  6. memcached线程模型

    直接上图: memcached使用多线程模型,一个master线程,多个worker线程,master和worker通过管道实现通信. 每个worker线程有一个队列,队列元素为CQ_ITEM. ty ...

  7. STL下<algorithm>下的sort函数

    定义: sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序.sort函数进行排序的时间复杂度为nlog2n,比冒泡之类的排序算法效率要高,sort函数包含在头文件为#i ...

  8. Linux文件系统基本结构

    (1)Linux文件系统为一个倒转的单根树状结构: (2)文件系统的根为“/”: (3)文件系统严格区分大小写: (4)路径使用“/”分割(windows使用“\”): 当前工作目录 (1)每个she ...

  9. qt获取指定目录下符合条件的文件路径

    1)设置名称过滤器 QDir * dir = new QDir(路径); QStringList filter; Filter << QStringLiteral(“筛选的文件条件,如.x ...

  10. Android 8.1 关机充电动画(一)模式选择

    system:Android 8.1 platform:RK3326/PX30 uboot kernel Android 8.1 关机充电动画(一)模式选择 Android 8.1 关机充电动画(二) ...