斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】
hihocoder #1143 : 骨牌覆盖问题·一
描述
骨牌,一种古老的玩具。今天我们要研究的是骨牌的覆盖问题:
我们有一个2xN的长条形棋盘,然后用1x2的骨牌去覆盖整个棋盘。对于这个棋盘,一共有多少种不同的覆盖方法呢?
举个例子,对于长度为1到3的棋盘,我们有下面几种覆盖方式:

输入
第1行:1个整数N。表示棋盘长度。1≤N≤100,000,000
输出
第1行:1个整数,表示覆盖方案数 MOD 19999997
- 样例输入
-
62247088
- 样例输出
-
17748018 分析:n超大,如果按照递推计算斐波那契第n项相当费时间,线性代数的矩阵有加速运算的效果。 此代码基本可以算作模板,但需要注意一个地方,在上面的这道题目中,f[1]=1,f[2]=2,,,以此类推下去。
但有的序列可能是:1 1 2 3,,,因为有一点不同就需要稍微修改一下矩阵累乘的次数,也就是矩阵的指数。
代码:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <math.h>
#define eps 1e-8
#include <algorithm> using namespace std; //矩阵快速幂运算(矩阵加速运算) struct matrix{
long long a[2][2]; //定义2x2的矩阵
}; matrix mul(matrix x, matrix y, long mod )
{
matrix ret; //按照矩阵相乘求ret矩阵的每个元素的值 然后返回它
ret.a[0][0]=((x.a[0][0]%mod)*y.a[0][0]%mod + (x.a[0][1]%mod)*y.a[1][0]%mod )%mod;
ret.a[0][1]=((x.a[0][0]%mod)*y.a[0][1]%mod + (x.a[0][1]%mod)*y.a[1][1]%mod )%mod;
ret.a[1][0]=((x.a[1][0]%mod)*y.a[0][0]%mod + (x.a[1][1]%mod)*y.a[1][0]%mod )%mod;
ret.a[1][1]=((x.a[1][0]%mod)*y.a[0][1]%mod + (x.a[1][1]%mod)*y.a[1][1]%mod )%mod;
return ret;
} //求矩阵x的幂取模,e为指数
matrix mypow(matrix x, long long e, long mod)//(x^e)%mod
{
matrix ret, temp;
if(e==0){
ret.a[0][0]=1; ret.a[0][1]=0;
ret.a[1][0]=0; ret.a[1][1]=1;
return ret;
}
if(e==1) return x; //当指数为1时,返回原来的矩阵 temp=mypow(x, e>>1, mod); //x的 e/2次方
ret=mul(temp, temp, mod); //ret=temp*temp
if(e&1) ret=mul(ret, x, mod); //如果e为奇数,ret乘以x return ret; //返回答案
} int main()
{
long n, m=19999997;//m就是mod
matrix ans; while(scanf("%ld", &n)!=EOF)
{
//矩阵初始化
ans.a[0][0]=1; ans.a[0][1]=1;
ans.a[1][0]=1; ans.a[1][1]=0; if( n ){
ans = mypow(ans, n, m); //此处的n就是指数(考虑n是否在对应的题目中需要修改), m是取模数
printf("%lld\n", ans.a[0][0]);
}else{
printf("0\n");
}
}
return 0;
}
斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】的更多相关文章
- 51nod 1242 斐波那契数列的第N项——数学、矩阵快速幂
普通算法肯定T了,所以怎么算呢?和矩阵有啥关系呢? 打数学符号太费时,就手写了: 所以求Fib(n)就是求矩阵 | 1 1 |n-1 第一行第一列的元素. | 1 0 | 其实学过线代 ...
- HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- HDU----(4549)M斐波那契数列(小费马引理+快速矩阵幂)
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- [HDU 4549] M斐波那契数列
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- hdu4549 M斐波那契数列 矩阵快速幂+快速幂
M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的 ...
- M斐波那契数列(矩阵快速幂+费马小定理)
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- hdu 4549 M斐波那契数列 矩阵快速幂+欧拉定理
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Problem ...
- HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)
M斐波那契数列 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submi ...
- NYOJ 1000 又见斐波那契数列
描述 斐波那契数列大家应该很熟悉了吧.下面给大家引入一种新的斐波那契数列:M斐波那契数列. M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[ ...
随机推荐
- Guice 学习(七)常量和属性的注入( Constant and Property Inject)
1.常量注入方式 package com.guice.ConstantInjectDemo; import com.google.inject.Binder; import com.google.in ...
- java 安装后 不能 java javac 说找不到命令 -bash: javac: command not found
java 安装后 不能 java javac 说找不到命令 -bash: javac: command not found 不是环境变量的问题, 直接cd到java的目录 也不能执行命令 后来发现是 ...
- layer 不居中的坑爹问题
使用了该代码弹出一个图片.但居然不居中 var layer_index = layer.open({ type: 1, title: false, closeBtn: 0, area: '516px' ...
- SpringBoot使用Thymeleaf模板
© 版权声明:本文为博主原创文章,转载请注明出处 Thymeleaf模板简介 Thymeleaf模板是一个现代化的服务端java模板引擎对于所有的web和独立环境 Thymeleaf的主要目标是为你的 ...
- Atitit.pdf 预览 转换html attilax总结
Atitit.pdf 预览 转换html attilax总结 1. Swf flash还是html1 2. pdf2htmlEX1 3. iText 5.5.0 发布,Java 的 PDF 操作类库1 ...
- maven的一些基础命令
1.显示当前构建的实际pom,包括活动的Profile mvn help:effective-pom 2.打印出项目的世界settings,包含从全局的settings和用户级别settings继承的 ...
- scala 遇到过的问题
1:在我安装完scala的插件后,在打开方法的实现类(open implementactions)的时候,抛出这个异常,后来发现这个异常是因为我的scala的插件跟我eclipse版本不兼容导致的. ...
- linux把某个文件拷贝到不同的目录下面
find -name '7*' -type d|xargs -n 1 cp PBClassname.properties
- Elasticsearch5.X IN Windows 10 系列文章(1)
系统类型:windows10 64位家庭版 ElasticSearch版本: 5.5.1 (最新稳定版为5.5.2),由于用到IK中文分词插件,最新版本没有5.5.2 ,所以使用5.5.1 日期:2 ...
- mysql 5.7 迁移数据方案
从一台服务器迁移至其他服务器,如何选择最短的停服时间方案 方案一.凌晨3点的全备份+停服后一天的大概一天的增备 1. 拷贝前一天的全备份至新的服务器 rsync -auzrP /Data/dbbak/ ...