题解 [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. vue-scroller 滑动组件使用指南

    在页面中经常会用到滚动,下拉刷新,下拉加载等功能,vux的scroller可以使用,但是它不再维护,而且要配合load-more组件一起使用.所以一般在项目中我都是用vue-scroller. vue ...

  2. 【dfs】Sequence Decoding

    Sequence Decoding 题目描述 The amino acids in proteins are classified into two types of elements, hydrop ...

  3. Scratch编程:游来游去的鱼(二)

    “ Scratch编程学习环境搭建好了吗?让我们一起来进行游戏吧!” 01 — 游戏介绍 这是一款简单的小游戏,实现了一条小鱼在池塘里游来游去. 02 — 设计思路 1,这个游戏主要由一个池塘背景和一 ...

  4. maven配置阿里镜像

    在conf\settings.xml 在<mirrors>里面添加   <mirror>    <id>nexus-aliyun</id>    < ...

  5. C++ 去掉字符串的首尾空格和全部空格

    #include <iostream>#include <string>using namespace std; //去掉收尾空格string& ClearHeadTa ...

  6. HTTP无状态协议理解

    TTP协议是无状态协议. 无状态是指协议对于事务处理没有记忆能力.缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大.另一方面,在服务器不需要先前信息时它的应 ...

  7. 在论坛中出现的比较难的sql问题:34(递归 获取连续值问题)

    原文:在论坛中出现的比较难的sql问题:34(递归 获取连续值问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  8. js实现CheckBox全选或者不全选

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">< ...

  9. interface Part4(接口中的多态)

    使用接口实现多态 需要满足以下两个条件. 定义接口并使用类实现了接口中的成员. 创建接口的实例指向不同的实现类对象. 假设接口名称为 ITest,分别定义两个实现类来实现接口的成员,示例代码如下. i ...

  10. Canvas 绘制一个像素风电子时钟

    想法是在 Canvas 上绘制由小方块组成的数字. 第一步是实现绘制小方块的方法,先画出一个边长为 5 的 10x10 个方块,使用两个 for 循环很简单就能完成. for (let i = 0; ...