在模意义下,使用通项公式没有了精度误差,就变的可以使用了
斐波那契数列的通项公式是:
\(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. ABB机器人套接口通信 机器人部分
  2. 一文详解 | 开放搜索兼容Elasticsearch做召回引擎
  3. 【Linux】第一章 整合 JDK 和 MariaDB(附 Linux 基本命令)
  4. 什么是SQL Server故障转移群集
  5. 程序员如何勇敢说“不”!
  6. jquery滑动效果及事件切换
  7. OSChina 周一乱弹 —— 有钱人的故事真让人心动
  8. 联想服务器引导盘制作工具,联想(Lenovo)服务器System X 系列无法进入引导盘Server Guide的解决方案 - 王耍耍...
  9. nova虚拟机迁移一
  10. 万字长文:上海交大校友、宾大直博博士细说五年读博经历
  11. HDLBits在线练习题之Exams/ece241 2014 q7b
  12. widows快捷键大全
  13. Jackson多克隆抗体丨艾美捷Jackson纳米二级抗体研究
  14. win10如何安装mysql_win10安装mysql详细步骤
  15. python实现从身份证截取出生日期以及性别判断
  16. 一道积分不等式的最优估计探索
  17. CSS3 3D变换--扑克牌翻转
  18. 嵌入式Linux开发教程:Linux常见命令(上篇)
  19. Python图片下载器(单线程PK多线程)_一蓑烟雨任平生
  20. cad画正弦曲线lisp_AutoCAD怎么画正弦线?

热门文章

  1. cadence SPB17.4 - remove Outputs file from DSN project
  2. “乔帮主”的云技术实践绝学,“降云十八掌”
  3. 计算机三级mysql好考吗_经验分享|一个月如何考过计算机三级数据库技术?
  4. 优采云自动文章采集器到底怎么样?怎么做?
  5. 前端-javascript(下)
  6. MeterSphere在开源压测工具JMeter上的分布式优化和实践
  7. Cannot find ./catalina.sh
  8. ntoskrnl.exe原因造成的 蓝屏
  9. java微信企业号接入_微信企业号登录授权Java实现根据userid换openid
  10. fieldset标签及相关设置