题意:我们有一个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. Metasploit和python两种安全工具的学习笔记

    Metasploit是个好东西 主要参考了<Metasploit渗透测试魔鬼训练营>这本书. 一.先用自己的靶机感受一下该工具的强大 linux靶机的ip如图 按照书上写的配置,如图 然后 ...

  2. 整数划分——真正的递归经典例题(NYOJ——90)

    先注明学习博客的地址:(http://www.cnblogs.com/hoodlum1980/archive/2008/10/11/1308493.html) 题目描述:任何正整数n都可以写成n=n1 ...

  3. http-server swagger-editor启动成功后,访问404的解决方法

    出现如图所示,则是swagger启动成功 但在网页访问是出现404,则查看下是否是在swagger-editor的目录下使用了该命令. 若在swagger-editor目录下使用命令启动,虽能启动成功 ...

  4. KOL运营之——如何与网文作者高效地约稿?

    本文来自网易云社区,转载务必请注明出处. 随着网络文学的发展,影响力逐渐扩大,越来越多的同事在工作中遇到需要和这些作者打交道的时候.对于作者这个群体,很多时候都是只闻其书,不见其人.要跟这样的群体打交 ...

  5. 微信小程序小结(1) ------ 前后端交互及wx.request的简易封装

    微信小程序的应用目前越来越多,不管喜欢与否我们都应该了解一些.废话不多,直接干货. 做项目自然避免不了前后端的交互,小程序在调试过程中需要在先在:小程序公众平台--设置--开发设置中,将要从后台请求的 ...

  6. 前端页面唯一字符串生成(Js)UUID

    function uuid() { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 3 ...

  7. Baidu - Echarts 地图实例测试,并绘制平滑圆弧路径

    百度Echarts实例地址: http://echarts.baidu.com/examples.html 同事想做一个地图,地图上的几个点通过动态的线连接起来.但是在实例里没找到类似的. 然后仔细分 ...

  8. Hadoop localhost ssh 免密码登陆

    配置本地ssh免密码登陆,遇到很奇怪的问题,原来在公司电脑上,是按照 http://blog.csdn.net/hackerwin7/article/details/28109073 这里说的配置的, ...

  9. 2.python中的矩阵、多维数组----numpy

    最近在将一个算法由matlab转成python,初学python,很多地方还不熟悉,总体感觉就是上手容易,实际上很优雅地用python还是蛮难的.目前为止,觉得就算法仿真研究而言,还是matlab用得 ...

  10. 2017-11-7 NOIP模拟赛

    1.数学老师的报复 #include<iostream> #include<cstdio> using namespace std; int cnt; ]; long long ...