矩阵乘法

205. 斐波那契

在斐波那契数列中,Fib0=0,Fib1=1,Fibn=Fibn1+Fibn2(n>1)

给定整数 n,求 Fibnmod10000

输入格式

输入包含多组测试用例。

每个测试用例占一行,包含一个整数 n

当输入用例 n=1 时,表示输入终止,且该用例无需处理。

输出格式

每个测试用例输出一个整数表示结果。

每个结果占一行。

数据范围

0n2×109

输入样例:

0 9 999999999 1000000000 -1

输出样例:

0 34 626 6875

解题思路

矩阵乘法

首先有:Fibn=Fibn1+Fibn2,设 f(n)=[Fibn,fibn+1]f(n1)=[Fibn1,fibn],寻找两者之间的关系:
[Fibn,fibn+1]=[Fibn1,fibn]×image
A=image,有 f(n)=f(n1)×A,递推得:f(n)=f(0)×An,其中 f(0)=[0,1],配合快速幂便可解决此题~

  • 时间复杂度:O(23×logn)

代码

#include<bits/stdc++.h> using namespace std; const int mod=10000; int n; void mul(int f[],int a[][2]) { int c[2]; memset(c,0,sizeof c); for(int i=0;i<2;i++) for(int j=0;j<2;j++) c[i]=(c[i]+f[j]*a[j][i])%mod; memcpy(f,c,sizeof f); } void mulself(int a[][2]) { int c[2][2]; memset(c,0,sizeof c); for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) c[i][j]=(c[i][j]+a[i][k]*a[k][j])%mod; memcpy(a,c,sizeof c); } int main() { while(scanf("%d",&n),n!=-1) { int f[2]={0,1},a[2][2]={{0,1},{1,1}}; for(;n;n>>=1) { if(n&1)mul(f,a); mulself(a); } printf("%d\n",f[0]); } return 0; }

__EOF__

本文作者acwing_zyy
本文链接https://www.cnblogs.com/zyyun/p/15561254.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zyy2001  阅读(31)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示