B站挂了,无题YY


 很久以前就听说 斐波那契数列 第N项有一种快速求法,但一听要用到矩阵就缩了。。。。。。今天把这个外强中干的家伙YY出来了。。。。。。(说实话是看了别人的吧?人艰不拆啊啊)还是太弱了
什么?不知道斐波那契数列是个什么东东?我只好说如图

求斐波那契数列第N项思路  (当然题目会让你对答案取余啦,什么取余不会?去看以前的《猴哥的一天》)
暴力,一路推过去  。。。。。。要是可以不超时我用个毛的矩阵啊。。。。。。 
2  通项公式?我们先来看一看通项公式。。。   这么复杂,还有根号,还有N次方?你当计算机能存分数啊,都只能存小数,如果你不怕误差的话可以这么做。。。。。
3  
高端方法,如图 ,然后不是有个显然的递推关系么,于是推出 这个东东,然后快速幂快速求那个n-2次方,然后乱搞得答案。。。。。。


c++(犯了个低级错误。。。。。F[1][1]初始化时应为0,打成了1,于是第四项莫名其妙变成了4 )

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,m,a[2][2]={0},f[2][2],ans[2][2],ans1;
int main()
{
scanf("%d",&n);  m=10000;
f[0][0]=1;f[0][1]=1;
f[1][0]=1;f[1][1]=0;
if (n==1||2==n) {cout<<1<<endl; return 0;}
a[0][0]=1;a[0][1]=1;
a[1][0]=1;a[1][1]=0;
int x=n-3;
while (x>0)
{
if (x%2==1) 
{
ans[0][0]=f[0][0];
ans[0][1]=f[0][1];
ans[1][0]=f[1][0];
ans[1][1]=f[1][1];
//cout<<f[0][0]<<' '<<f[0][1]<<endl;
//cout<<f[1][0]<<' '<<f[1][1]<<endl;
//cout<<endl;
f[0][0]=(a[0][0]*ans[0][0]%m + a[0][1]*ans[1][0]%m)%m;
f[0][1]=(a[0][0]*ans[0][1]%m + a[0][1]*ans[1][1]%m)%m;
f[1][0]=(a[1][0]*ans[0][0]%m + a[1][1]*ans[1][0]%m)%m;
f[1][1]=(a[1][0]*ans[0][1]%m + a[1][1]*ans[1][1]%m)%m;
//cout<<f[0][0]<<' '<<f[0][1]<<endl;
//cout<<f[1][0]<<' '<<f[1][1]<<endl;
}
ans[0][0]=a[0][0];
ans[0][1]=a[0][1];
ans[1][0]=a[1][0];
ans[1][1]=a[1][1];
x/=2;
a[0][0]=(ans[0][0]*ans[0][0]%m + ans[0][1]*ans[1][0]%m)%m;
a[0][1]=(ans[0][0]*ans[0][1]%m + ans[0][1]*ans[1][1]%m)%m;
a[1][0]=(ans[1][0]*ans[0][0]%m + ans[1][1]*ans[1][0]%m)%m;
a[1][1]=(ans[1][0]*ans[0][1]%m + ans[1][1]*ans[1][1]%m)%m;
//cout<<endl;
//cout<<a[0][0]<<' '<<a[0][1]<<endl;
//cout<<a[1][0]<<' '<<a[1][1]<<endl;
}
ans1=(f[0][0]+f[0][1])%m;
cout<<ans1<<endl;
return 0;
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值