在模意义下,使用通项公式没有了精度误差,就变的可以使用了
斐波那契数列的通项公式是:
\(F(n)=\frac{\frac{\sqrt{5}+1}{2}^{n}-\frac{-\sqrt{5}+1}{2}^{n}}{\sqrt{5}}\)

而 \(\sqrt{5}\) 在不同的模数下,不一定存在,否则枚举一下或者二次剩余定理弄一下就可以求出来

在通项公式中是实际上可以把两项分开算 \(\frac{\sqrt{5}+1}{2}^{n}\),\(\frac{-\sqrt{5}+1}{2}^{n}\)

但是在分母中还是有一个 \(\sqrt{5}\) 要除,那么我们观察式子,分子的不带 \(\sqrt{5}\) 的项都是相同的,并且指数都是 \(n\),所以最后求出来的结果是一样的,最后相减就抵消了,所以我们只需要关心 \(\sqrt{5}\) 的系数就行了,最关键的是:分母还有一个 \(\sqrt{5}\) 那么不就和分子中的 \(\sqrt{5}\) 抵消掉了,我们根本不用关心\(\sqrt{5}\) 的值了,最后答案就是 \(\sqrt{5}\) 的系数了

不妨把一个数表示成 \(a*\sqrt{5}+b\) 的形式,那么乘法之后还是一个关于 \(\sqrt{5}\) 的表达式
我们定义一个类,重载一下运算就可以了

关于这个东西求逆,列个方程算一下发现逆元就是 \(\frac{-\sqrt{5}*a}{b^2-5*a^2}+\frac{b}{b^2-5*a^2}\),相乘得到 \((0,1)\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1100,mod=998244353,inv2=499122177;
ll f[N];
inline int qpow(int x,int k){int sum=1;while(k){if(k&1)sum=1ll*sum*x%mod;x=1ll*x*x%mod;k>>=1;}return sum;
}
struct Num{int a,b;//a*sqrt(5)+bNum(){a=0;b=0;}Num(int _a,int _b){a=_a;b=_b;}Num operator *(const Num &p){return Num((1ll*b*p.a+1ll*a*p.b)%mod,(1ll*a*p.a*5+1ll*b*p.b)%mod);}Num operator -(const Num &p){return Num((a-p.a+mod)%mod,(b-p.b+mod)%mod);}Num inv(){int t=qpow(((1ll*b*b-1ll*5*a*a)%mod+mod)%mod,mod-2);return Num(1ll*(mod-a)*t%mod,1ll*b*t%mod);}
}Z=Num(inv2,inv2),F=Num(mod-inv2,inv2);
inline Num qm(Num x,int k){Num S=Num(0,1);while(k){if(k&1)S=S*x;x=x*x;k>>=1;}return S;
}
int main(){freopen("pp.in","r",stdin);freopen("pp.out","w",stdout);f[1]=1;int n=999;for(int i=2;i<=n;i++)f[i]=(f[i-1]+f[i-2])%mod;Num S=qm(Z,n),T=qm(F,n);S=S-T;cout<<S.a<<endl<<f[n]<<endl;return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/8807629.html

维护斐波那契数列通项公式相关推荐

  1. 斐波拉契数列通项公式

    斐波拉契数列通项公式 当 即

  2. 斐波那契数列通项公式的推导证明----举一反三

    斐波那契数列通项公式的推导证明----举一反三 1-前言 2-斐波那契 2-1-什么是斐波那契 2-2-通项公式的证明 2-3-举一反三 1-前言 2021年5月20号的那天,有对象的都忙着约会秀恩爱 ...

  3. 利用生成函数求斐波那契数列通项公式

    利用生成函数求斐波那契数列通项公式 先吐槽一下,学习这玩意儿的时候真的是深深的明白了自己的弱小,人家的一个"解得"我居然解了两个小时..qwq 前置知识 斐波那契数列: \[f_i ...

  4. 【斐波那契数列通项公式求解】

    斐波那契数列,又称黄金分割数列,数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为"兔子数列",该数列在数学上定义为 前几项为: 1,1,2,3,5,8,13,21,34 斐 ...

  5. python查询斐波那契数列通项公式_分享一个神奇的操作系统——斐波那契+MACD,每一波都有20%以上的收益!...

    斐波那契数列,又称兔子数列,或者黄金分割数列.指的是这样一个数列: 0.1.1.2.3.5.8.13.21--从第三项起,它的每一项都等于前两项的和. 为什么是兔子数列?我们假设兔子在出生两个月后,就 ...

  6. python查询斐波那契数列通项公式_斐波那契数列求解总结(Python版)

    最近在查阅斐波那契数列时,看到下面的文章,总结得非常好,于是自己上手使用 Python 练习并实现多种求解方法 守望:面试官问你斐波那契数列的时候不要高兴得太早​zhuanlan.zhihu.com ...

  7. 斐波那契数列通项公式

    定义 斐波那契数列指的是每一项都等于前两项之和的数列,定义为F[1]=1,F[2]=1, F[n]=F[n-1]+F[n-2](n>=3). 通项公式 我们先来研究形如F[n]=c1F[n-1] ...

  8. 【算法】斐波那契数列通项公式

    特征方程和通项公式 如果数列ana_nan​的递推公式:an=c1an−1+c2an−2a_n=c_1a_{n-1}+c_2a_{n-2}an​=c1​an−1​+c2​an−2​------(1) ...

  9. 斐波那契数列通项公式的求法

    以下两种方法其实是一样的 1.方法一 其实所有人都知道T(n)= T(n-1) + T(n-2), T(1) = T(2)=1,T(n)也是一个斐波那契数列,求解时间复杂度的本质也就是求数列通项,结果 ...

最新文章

  1. Java数据访问对象模式
  2. exit函数_全面深入了解 Python 魔法函数
  3. php和python哪个学起来简单一点-Php和python php和python哪个容易学
  4. linux 自定义目录,linux – cron命令的自定义目录
  5. 【奇淫巧技】XSS绕过技巧
  6. .net bitmap rgb数据_在3D空间,用点云数据学行人重识别特征
  7. vb怎么运用api对文件夹进行加密_[MIUI玩法篇 30] | 小米私密文件夹 深度揭秘
  8. C# Tips 2------ToolStripSplitButton's 'Checked' property
  9. Python3算术运算符
  10. Oracle EBS 入门
  11. select函数返回值_Vue学习笔记之函数、高阶函数、v-model的应用
  12. ABP源码分析四十七:ABP中的异常处理
  13. zabbix触发器表达式详解
  14. Android Debug方法
  15. arm指令集 c语言,这些Cortex-A处理器支持的指令集,您都知道吗?
  16. HS8145X6华为界面telnet23账号密码重置
  17. 图片处理--羽化特效
  18. 爱python,爱学习
  19. python批量修改Excel文件后缀csv为xlsx
  20. 此安装不支持该项目类型

热门文章

  1. python爬虫--根据身份证号码获取户籍地、出生年月等信息
  2. 经典老歌-杜德伟《彩虹》
  3. 常见的数据库故障有哪些?
  4. rac管理 sqlserver_Oracle RAC系列之:利用srvctl管理RAC数据库
  5. 如何使用gzip压缩加快页面显示速度
  6. SQL*Plus 系统变量之37 - PAU[SE]
  7. 我用泡妹子追 MM 的技术学会了 23 种设计模式!
  8. 无人驾驶汽车系统入门(十)——基于运动学模型的模型预测控制
  9. c#父窗体子窗体之间传值
  10. Keil打开工程时,解决“Loading PDSC Debug Description Failed”错误