【历年真题】斐波那契数列logn做法
描述
【题解】
用矩阵乘法加速递推
[0 1]
[1 1]
*
[f[n-1]]
[f[n-2]]
[f[n-1]]
[f[n]]
求A矩阵的n-2次幂然后再乘B矩阵。
结果矩阵中的第二行第一列就是f[n]的结果了
【代码】
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
const int N = 100;
const long long MOD = 1e9+7;
const int G = 2;
struct abc{
ll v[G+10][G+10];
void print(){
for (int i = 1;i <= G;i++)
{
for (int j = 1;j <= G;j++)
printf("%I64d ",v[i][j]);
puts("");
}
puts("");
}
void E(){
memset(v,0,sizeof v);
for (int i = 1;i <= G;i++) v[i][i]=1;
}
void O(){
memset(v,0,sizeof v);
}
abc operator * (const abc b) const{
abc temp;temp.O();
for (int i = 1;i <= G;i++)
for (int j = 1;j <= G;j++){
ll sum = 0;
for (int k = 1;k<= G;k++){
sum=(sum+v[i][k]*b.v[k][j])%MOD;
}
temp.v[i][j] = sum;
}
return temp;
}
abc operator ^(int n)const{
abc x;x.E();
abc y;memcpy(y.v,v,sizeof(v));
while (n>0){
if (n&1) x=x*y;
y = y*y;
n/=2;
}
return x;
}
};
abc a,b;
int n;
int main(){
scanf("%d",&n);
a.O();
a.v[1][1] = 0;a.v[1][2] = 1;
a.v[2][1] = 1;a.v[2][2] = 1;
b.O();
b.v[1][1] = 1;b.v[2][1] = 1;
if (n<=2){
printf("%d\n",1);
}else{
a = a^(n-2);
a = a*b;
printf("%I64d\n",a.v[2][1]);
}
return 0;
}
【历年真题】斐波那契数列logn做法的更多相关文章
- NOIP模拟题 斐波那契数列
题目大意 给定长度为$n$序列$A$,将它划分成尽可能少的若干部分,使得任意部分内两两之和均不为斐波那契数列中的某一项. 题解 不难发现$2\times 10^9$之内的斐波那契数不超过$50$个 先 ...
- 【校招面试 之 剑指offer】第10-1题 斐波那契数列
递归以及非递归实现: #include<iostream> using namespace std; long long fun(long long n){ if(n == 0){ ret ...
- 1242 斐波那契数列的第N项
1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F( ...
- 用PHP迭代器来实现一个斐波纳契数列(转)
斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...
- 用PHP迭代器来实现一个斐波纳契数列
斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...
- 【每天一题ACM】 斐波那契数列(Fibonacci sequence)的实现
最近因为一些原因需要接触一些ACM的东西,想想写个blog当作笔记吧!同时也给有需要的人一些参考 话不多说,关于斐波那契数列(Fibonacci sequence)不了解的同学可以看看百度百科之类的, ...
- hdu 2044:一只小蜜蜂...(水题,斐波那契数列)
一只小蜜蜂... Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepte ...
- 51 Nod 1242 斐波那契数列的第N项(矩阵快速幂模板题)
1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) ...
- 计蒜客 28319.Interesting Integers-类似斐波那契数列-递推思维题 (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 I)
I. Interesting Integers 传送门 应该是叫思维题吧,反正敲一下脑壳才知道自己哪里写错了.要敢于暴力. 这个题的题意就是给你一个数,让你逆推出递推的最开始的两个数(假设一开始的两个 ...
随机推荐
- 前端学习(十八)js的json(笔记)
json: 数组: 1.有序 var arr=[2,1,3,4] arr[0]; 2.有length 3.普通for 4.下标数字 5.添加删除 splice json: ...
- socket中的绑定
- 08-01-json-loggin-模块
复习 ''' ATM: -- start.py BASE_DIR = os.path.dirname(__file__) sys.path.append(BASE_DIR) -- conf -- li ...
- Java 基础 - 如何理解String不可变
ref: https://www.zhihu.com/question/20618891 第一个答案. 扩展“ Java 基础 - System.arraycopy() 浅拷贝 深拷贝
- 创建TCP服务器和TCP客户端
import sockethost='127.0.0.1'port=8080web=socket.socket()web.bind((host,port))web.listen(5)# 设置最多连接数 ...
- php获取网页源码分行显示
file(PHP 3, PHP 4 )file -- 把整个文件读入一个数组中说明:file ( string filename [, int use_include_path [, resource ...
- jQuery选择器 (详解)
1. 基础选择器 Basics 名称 说明 举例 #id 根据元素Id选择 $("divId") 选择ID为divId的元素 element 根据元素的名称选择, $(" ...
- flutter 使用keyboard_actions 关闭ios键盘
项目中登录 输入账号密码 弹出的键盘 关闭不了,从而 引来一些问题, 1,第一次关闭 项目是在 最外层包裹一层,点击的时候进行关闭, return Scaffold( resizeToAvoidBot ...
- C++语言编程基础
C++程序设计语言可以看作C语言的改进和升级,不仅完全兼容了C语言的语法和函数库,还引入了面向对象.运算符重载.多态性.数据流和模板等最新的编程思想.极大地保证了源代码的生产率.质量和可重用性.GNU ...
- windows10安装sqlmap与简单配置
一.获取sqlmap压缩包: 注意:安装sqlmap之前,先确认已有python2.x环境 获取sqlmap压缩包并解压 下载地址:http://sqlmap.org/ 二.将解压缩的文件放在pyth ...