2016级算法第一次练习赛-C.斐波那契进阶
870 斐波那契进阶
题目链接:https://buaacoding.cn/problem/870/index
思路
通过读题就可以发现这不是一般的求斐波那契数列,所以用数组存下所有的答案是不现实的。题目也明确点明此题可以利用矩阵的计算解题。
如果你稍微百度一下你会了解到快速矩阵幂的概念。
分析
快速矩阵幂算法是一种简单的具有典型意义的连续为离散算法,同学们一定要掌握其思想,而不是从网上copy一份板子就用。
时间复杂度:\(O(lgN)\);
考点:简单的快速矩阵幂;
坑点:一边计算一边取模才不会找过范围。
参考代码
//
// Created by AlvinZH on 2017/10/1.
// Copyright (c) AlvinZH. All rights reserved.
//
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string>
#include <bitset>
#include <utility>
#include <functional>
#include <iomanip>
#include <sstream>
#include <ctime>
#define INF 0x3f3f3f3f
#define eps 1e-8
#define MaxSize 100005
#define MOD 10007
typedef long long LL;
using namespace std;
const int N = 2;
struct Matrix {
int mat[N][N];
Matrix() {}
Matrix operator * (const Matrix& b) const {
Matrix result;
memset(result.mat, 0, sizeof(result.mat));
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
for (int k = 0; k < N; ++k) {
result.mat[i][j] = (result.mat[i][j] + this->mat[i][k] * b.mat[k][j]) % MOD;
}
}
}
return result;
}
};
Matrix MatPow(Matrix base, int n)
{
Matrix result;
memset(result.mat, 0, sizeof(result.mat));
for (int i = 0; i < N; ++i) {
result.mat[i][i] = 1;
}
while (n > 0)
{
if(n & 1) result = result * base;
base = base * base;
n >>= 1;
}
return result;
}
int main()
{
Matrix base;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
base.mat[i][j] = 1;
}
}
base.mat[1][1] = 0;
int n;
while (~scanf("%d", &n))
{
Matrix ans = MatPow(base, n);
printf("%d\n", ans.mat[0][1]);
}
}
2016级算法第一次练习赛-C.斐波那契进阶的更多相关文章
- 2016级算法第一次练习赛-A.群鸦的盛宴
858 群鸦的盛宴 题目链接:https://buaacoding.cn/problem/858/index 思路 本题乍一眼看过去,你可能会想到使用一个二维数组A[51][51]来记录从i到j的路线 ...
- 2016级算法第一次练习赛-F.AlvinZH的儿时梦想——机器人篇
864 AlvinZH的儿时梦想----机器人篇 题目链接:https://buaacoding.cn/problem/868/index 思路 中等题. 判断无限玩耍: \(p\) 的值能够承担的起 ...
- 2016级算法第一次练习赛-E.AlvinZH的儿时回忆——蛙声一片
864 AlvinZH的儿时回忆----蛙声一片 题目链接:https://buaacoding.cn/problem/865/index 思路 中等题.难点在于理解题意!仔细读题才能弄懂题目规则.整 ...
- 2016级算法第一次练习赛-D.AlvinZH的儿时回忆——跳房子
864 AlvinZH的儿时回忆----跳房子 题目链接:https://buaacoding.cn/problem/864/index 思路 这是一道简单题,但是同样有人想复杂了,DP?大模拟?. ...
- 2016级算法第一次练习赛-B.朴素的中位数
朴素的中位数 题目链接:https://buaacoding.cn/problem/846/index 分析 题意很简单,就是给定了两个从小到大排好序的数组,找出这两个数组合起来的数据中的中位数. 方 ...
- 算法 递归 迭代 动态规划 斐波那契数列 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 算法导论-求(Fibonacci)斐波那契数列算法对比
目录 1.斐波那契数列(Fibonacci)介绍 2.朴素递归算法(Naive recursive algorithm) 3.朴素递归平方算法(Naive recursive squaring) 4 ...
- 《BI那点儿事》Microsoft 时序算法——验证神奇的斐波那契数列
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10 ...
- 基于visual Studio2013解决算法导论之045斐波那契堆
题目 斐波那契堆 解决代码及点评 // 斐波那契堆.cpp : 定义控制台应用程序的入口点. // #include<iostream> #include<cstdio> ...
随机推荐
- mongodb修改用户名密码
首先先将启动mongo的配置文件里面的 auth:用户认证,改为false. 正确做法,利用db.changeUserPassword db.changeUserPassword('tank2','t ...
- js闭包原理与例子[转]
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.闭包原理: 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域 ...
- spring 获取 WebApplicationContext的几种方法
spring 获取 WebApplicationContext的几种方法 使用ContextLoader WebApplicationContext webApplicationContext = C ...
- [GO]二进制文件的拷贝
writestring的方式只适用于字符串的写入,对于十进制文件的写入只要使用write就可以了 package main import ( "os" "fmt" ...
- linux命令的笔记
1.改变目录的用户组和所有者 chown 命令 如下图: 可以看到test1与test2的的所有者和所属组都是root,其中 第三个字段是说明目录拥有者, 第四个字段是文件拥有者所在的组, 第五个字段 ...
- Linux下oracle定时备份
1. 设置数据库空表可导出(oracel11g) 用PL/SQL登录数据库(或者其他工具) 执行: select 'alter table '||table_name||' allocate exte ...
- SpringMVC源码解读 - HandlerMapping - SimpleUrlHandlerMapping初始化
摘要: SimpleUrlHandlerMapping只是参与Handler的注册,请求映射时由AbstractUrlHandlerMapping搞定. 初始化时,通过setMappings(Prop ...
- Postgresql导出指定的数据表
两对双引号"\"\""是用于解决:pg_dump: no matching tables were found 问题. pg_dump -h localhost ...
- .NET基础 (02).NET运行机制
.NET运行机制1 .NET程序被编译成什么形式的代码2 JIT是如何工作的3 简述程序集的加载机制4 如何配置程序集的版本策略 1 .NET程序被编译成什么形式的代码 .NET程序在编写完成后,会经 ...
- Ubuntu下安装配置android sdk及其环境变量
同理,这里介绍的是手动安装方法~ *系统;Ubuntu 16.4 1.下载Android sdk,直接在系统自带的firefox浏览器输入 http://tools.android-studio.or ...