题意:我们有一个2xN的长条形棋盘,然后用1x2的骨牌去覆盖整个棋盘。对于这个棋盘,一共有多少种不同的覆盖方法呢?

思路:这是斐波那契数列啊,f[n] = f[n-1] + f[n-2],初始时 f[0]=1,f[1]=1,f[2]=2。其实跟下面的递推思路差不多吧。但是关于这种简单,一般都可以用矩阵快速幂解决,即O(logn)时间内解决。主要难点是构造初始矩阵,如果是后面一个数字是由卡面两个数字相加而成的,那么一般可构造一个2*2的01矩阵,才这么小,随便试试吧,只要乘完的结果第二位是答案即可。

 #include <iostream>
using namespace std;
const int yu = ;
const int MASK = ;
struct fuf
{
long long a,b, //矩阵如左
c,d;
}q[]; int handle_it()
{
q[].a=; q[].b=; q[].c=; q[].d=; //矩阵M的1次方
int i=;
for(; i<=; i++) //作乘
{
q[i].a = ( q[i-].a * q[i-].a + q[i-].b * q[i-].c )%yu;
q[i].b = ( q[i-].a * q[i-].b + q[i-].b * q[i-].d )%yu;
q[i].c = ( q[i-].c * q[i-].a + q[i-].d * q[i-].c )%yu;
q[i].d = ( q[i-].c * q[i-].b + q[i-].d * q[i-].d )%yu;
}
return ;
}
int main()
{
handle_it();
int n;
while( cin>>n )
{
if( n> && n<=) {cout<<n<<endl;continue;}
int i=;
while( (n&MASK)== ) //直到n后面的0被去掉
{
i++;
n >>= ;
}
fuf ans = q[i++];
n >>= ;
for( ; i< && n!=; i++,n >>= )
{
if( (n&)== )
{
fuf tmp;
tmp.a = ( ans.a * q[i].a + ans.b * q[i].c )%yu;
tmp.b = ( ans.a * q[i].b + ans.b * q[i].d )%yu;
tmp.c = ( ans.c * q[i].a + ans.d * q[i].c )%yu;
tmp.d = ( ans.c * q[i].b + ans.d * q[i].d )%yu;
ans = tmp;
}
}
cout<<ans.d<<endl;
}
return ;
}

骨牌

  写了个递推的思路:

  (1)设dp[i]表示2*(i-1)的棋盘的摆放种数。

  (2)假设第i列是放一个竖的,那么dp[i+1]+=dp[i]。这样只是一种,所以只是单纯用加的方式。

  (3)假设第i列是放横的,那么连同第i+1列都被占用了,所以第i和i+1列就被摆放了两个横的,那么dp[i+2]+=dp[i]。这又是一种。

  (4)2*n的棋盘答案就自然是dp[n+1]了,表示前n列的摆放种数。

 #include <bits/stdc++.h>
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=1e8+;
const int mod=;
int dp[N], ans[N];
void pre_cal()
{
dp[]=;
for(int i=; i<N; i++)
{
dp[i+]=(dp[i+]+dp[i])%mod; //考虑放横
dp[i+]=(dp[i+]+dp[i])%mod; //考虑放直
ans[i]=(dp[i]+dp[i-])%mod;
}
} int main()
{
freopen("input.txt", "r", stdin);
pre_cal();
int n;
while(~scanf("%d",&n)) printf("%d\n",ans[n]);
return ;
}

TLE代码

hihoCoder #1143 : 骨牌覆盖问题·一 (斐波那契数列)的更多相关文章

  1. hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)

    [题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形 ...

  2. C#版 - 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解

    面试题9:斐波那契数列及其变形(跳台阶.矩形覆盖) 提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tp ...

  3. 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------>剑指offer系列

    题目:斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). f(n) = f(n-1) + f(n-2) 基本思路 这道题在剑指offe ...

  4. 斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】

    hihocoder #1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个 ...

  5. 斐波那契数列 51nod

    1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 斐波那契数列的定义如下:   F(0) = 0 F(1) = 1 F(n) ...

  6. 剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)

    递归与循环 递归:在一个函数的内部调用这个函数. 本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算) 优点:简洁,易于实现. 缺点:时间和空间消耗严重,如果递归调 ...

  7. javascript . 03 函数定义、函数参数(形参、实参)、函数的返回值、冒泡函数、函数的加载、局部变量与全局变量、隐式全局变量、JS预解析、是否是质数、斐波那契数列

    1.1 知识点 函数:就是可以重复执行的代码块 2.  组成:参数,功能,返回值 为什么要用函数,因为一部分代码使用次数会很多,所以封装起来, 需要的时候调用 函数不调用,自己不会执行 同名函数会覆盖 ...

  8. 【斐波那契数列】java探究

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 解析 (1)递归方式 对于公式f(n) = f(n-1) + f(n ...

  9. 《剑指offer》斐波那契数列

    本题来自<剑指offer> 斐波那契数列 矩阵覆盖 题目一: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 思路: ...

随机推荐

  1. jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值

    —.获取dropdownlist的text(ddlList为服务器端dropdownlist的ID,生成name属性等于ddlList的select标签) $("#ddlList optio ...

  2. 使用mount命令挂载CDROM

    Linux显示所有的目录都在一个目录树下,而于他们位于哪一个驱动器/硬件无关.在Linux下的磁盘内容作为子目录形式出现的.可移动介质的内容不会自动出现在这些自目录的,我们必须通过挂载驱动器来实现. ...

  3. Java Web之分页的实现(通用)

    一.用到的工具类的封装 为了实现代码的重用性,我们将经常用到的代码封装到工具类中,以便在任何地方都可以调用 1.获取路径工具 在jsp页面中,我们经常会向Servlet发送请求,并通过反射,实现通过传 ...

  4. java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page

    出现这个错误,首先看配置mybatis-config.xml中的<plugins> <plugin interceptor="com.github.pagehelper.P ...

  5. ORM(一)

    ORM常识: 1.一对多,多的一方设置外键字段,有外键字段的表叫做子表.没有外键字段的表叫做主表. 2.主表放到子表的下面,否则子表找不到主表,写数据要先往主表中写. 数据库:(1)不创建主键,会自动 ...

  6. 2017ACM/ICPC广西邀请赛

    A.A Math Problem #include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll ...

  7. urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>

    解决办法: import ssl # 在请求之前加上 ssl._create_default_https_context = ssl._create_unverified_context

  8. lintcode-dfs实现二叉树的层序遍历

    class Solution { /** * @param root: The root of binary tree. * @return: Level order a list of lists ...

  9. win10系统添加照片查看器(win7版)

    很多人不习惯win10的照片查看器,还是比较怀念win7版本的照片查看器,通过以下两种方法可以在win10图片上点击右键时,"打开方式"中重现"Windows照片查看器& ...

  10. 惠普台式机UEFI BIOS设置U盘启动

    开机按F9进入选中安装u盘启动软件的u盘,即可进入u盘启动选项,将于U盘安装系统操作一致 如:F9未找到U盘,可进行如下操作 1.开机时点击F10键进入BIOS更改选项:  更改 Advanced-- ...