题解 [51nod1358] 浮波那契

题面

解析

首先根据经验应该能一眼矩阵快速幂加速....

因为给了你递推式,并且\(O(n)\)求显然不可能.

所以考虑怎么构造矩阵.

首先要处理的是小数的问题,

这里我们可以把\(n\)扩大5倍,

那么就变成了

\[\begin{equation}f(n)=\left\{ \begin{array}{**lr**} 1 ,n\leq20 & \\ f(n-5)+f(n-17),otherwise \end{array}\right.\end{equation}
\]

然后考虑怎么构造矩阵,

想一想,一开始矩阵应该是这个样子:

\[\left[
\begin{matrix}
f(n-1)&f(n-2)&\dots&f(n-17)
\end{matrix}
\right]
\]

乘上一个矩阵得到

\[\left[\begin{matrix}f(n)&f(n-1)\dots&f(n-16)\end{matrix}\right]
\]

然后因为有重复的项我们就设为\(1\),再把递推的地方设为\(1\),其它地方设为\(0\).

讲的太不清楚了还是直接看矩阵吧

\[\left[\begin{matrix}01000000000000000&\\00100000000000000&\\00010000000000000&\\00001000000000000&\\10000100000000000&\\00000010000000000&\\00000001000000000&\\00000000100000000&\\00000000010000000&\\00000000001000000&\\00000000000100000&\\00000000000010000&\\00000000000001000&\\00000000000000100&\\00000000000000010&\\00000000000000001&\\10000000000000000&\\\end{matrix}\right]
\]

实际上结合矩阵乘法想一想应该就行了.

接下来直接跑矩阵快速幂即可.

code:

#include <iostream>
#include <cstring>
#include <cstdio>
#define ll long long
using namespace std; inline int read(){
int sum=0,f=1;char c=getchar();
while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}
while(c<='9'&&c>='0'){sum=sum*10+c-'0';c=getchar();}
return f*sum;
} const int N=101;
const int Mod=1000000007;
struct mat{
ll f[N][N];
inline void clear(){memset(f,0,sizeof f);}
inline void init(){clear();for(int i=0;i<N;i++) f[i][i]=1;}
}a,b;
ll n; inline mat operator*(mat a,mat b){
mat c;c.clear();
for(int k=0;k<17;k++){
for(int i=0;i<17;i++){
ll t=a.f[i][k];
for(int j=0;j<17;j++) c.f[i][j]=(c.f[i][j]+t*b.f[k][j])%Mod;
}
}
return c;
} inline mat fpow(mat a,ll b){
mat ret;ret.init();
for(;b;a=a*a,b>>=1) if(b&1) ret=ret*a;
return ret;
} signed main(){
n=read();
if(n<=4){puts("1");return 0;}
for(int i=0;i<17;i++) a.f[0][i]=1;
for(int i=0;i<16;i++) b.f[i][i+1]=1;
b.f[4][0]=1;b.f[16][0]=1;
a=a*fpow(b,n*5-20);
printf("%lld\n",a.f[0][0]);
return 0;
}

题解 [51nod1358] 浮波那契的更多相关文章

  1. 洛谷P1720 月落乌啼算钱 题解 斐波那契数列/特征方程求解

    题目链接:https://www.luogu.com.cn/problem/P1720 题目描述: 给你一个公式 ,求对应的 \(F_n\) . 解题思路: 首先不难想象这是一个斐波那契数列,我们可以 ...

  2. 【20180808模拟测试】T2 k-斐波那契

    描述 k-斐波拉契数列是这样的 f(0)=k;f(1)=k;f(n)=(f(n-1)+f(n-2))%P(n>=2); 现在我们已经知道了f(n)=1,和P: k的范围是[1,P); 求k的所有 ...

  3. OrzFAng系列–树 解题报告

    题目描述 方方方种下了三棵树,两年后,第二棵树长出了n个节点,其中1号节点是根节点. 给定一个n个点的树 支持两种操作 方方方进行m次操作,每个操作为: (1)给出两个数i,x,将第i个节点的子树中, ...

  4. 数学3(博弈+splya)

    数学3(博弈+splya) 标签: 数学 hdu_5194 (打表找规律) 题意 有n和黑球和m个白球,现在一个个的取出这些球,如果是黑球则当前标记为1,白球为0,那么当取完这些球会得到一些序列.问你 ...

  5. 【题解】斐波拉契 luogu3938

    题目 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家斐波那契提出的模型来进行 繁衍:一对兔子从出生后第二个月起,每个月刚开始的时候都会产下一对小兔子. ...

  6. cojs 疯狂的粉刷匠 疯狂的斐波那契 题解报告

    疯狂的斐波那契 学习了一些奇怪的东西之后出的题目 最外层要模p是显然的,然而内层并不能模p 那么模什么呢,显然是模斐波那契的循环节 那么我们可以一层层的求出每层的斐波那契循环节 之后在从内向外用矩阵乘 ...

  7. P1962 斐波那契数列-题解(矩阵乘法扩展)

    https://www.luogu.org/problemnew/show/P1962(题目传送) n的范围很大,显然用普通O(N)的递推求F(n)铁定超时了.这里介绍一种用矩阵快速幂实现的解法: 首 ...

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

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

  9. 题解 P2626 【斐波那契数列(升级版)】

    这道题,大家一定要注意: 要对2^31取模 ! ( 本蒟蒻开始没注意到这一点,WA了 ) (不过大家在试样例的时候,试试47,出不了结果,就说明你没模2^31) 总体来说,这道题考查的知识点就两个: ...

随机推荐

  1. [SVN] - 使用 TortoiseSVN 进行文件比对非常慢 之 解决

    背景 Windows 10 + TortoiseSVN-v1.9.7使用默认的 TortoiseMerge 进行文件比对,打开速度非常非常慢. 解决 禁用 TortoiseMerge / Settin ...

  2. Spring MVC <mvc:annotation-driven/>的作用

    一.mvc:annotation-driven的作用 Spring 3.0.x中使用了mvc:annotation-driven后,默认会帮我们注册默认处理请求,参数和返回值的类,其中最主要的两个类: ...

  3. 长乐培训Day9

    T1 立方数 题目 [题目描述] 作为XX战队的狂热粉丝,MdZzZZ看到了自己心仪的队伍在半决赛落败,顿时心灰意冷.看着自己手中的从黄牛那里抢来的天价总决赛门票,MdZzZZ觉得去鸟巢已经没有意义了 ...

  4. 利用Python进行数据分析 第7章 数据清洗和准备(1)

    学习时间:2019/10/25 周五晚上22点半开始. 学习目标:Page188-Page217,共30页,目标6天学完,每天5页,预期1029学完. 实际反馈:集中学习1.5小时,学习6页:集中学习 ...

  5. Java架构笔记:用JWT对SpringCloud进行认证和鉴权

    写在前面 喜欢的朋友可以关注下专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦. image.png JWT(JSON WEB TOKEN)是基于RF ...

  6. hoj 棋盘问题 状压入个门

    大概题意是:有一个n*m的棋盘,在这个棋盘里边放k个旗子,要求每一行每一列都不能存在一对旗子相邻,问最后总共的方案数. 我们先来考虑个简单的,假如说只有一行,要求在这一行里边填充k个旗子,要求任意两个 ...

  7. SQL Server2008 查找用户登录日志

    select loginname,accdate from sys.syslogins

  8. C#插入时间

    //获取日期+时间 DateTime.Now.ToString(); // 2008-9-4 20:02:10 DateTime.Now.ToLocalTime().ToString(); // 20 ...

  9. javascript -- 时间转换

    function numFormat(num){ //时间处理 return ('00' + num).substr(-2);    #处理 日期前面有0的情况}function timeFormat ...

  10. VBA错误处理(十八)

    在(VBScript/VBA)编程中有三种类型的错误: 语法错误 运行时错误 逻辑错误 语法错误 语法错误(也称为解析错误)发生在VBScript的解释时间. 例如,下面一行导致语法错误,因为它缺少一 ...