洛谷U418856题解

题解

方法一数组

利用fib[i] = fib[i - 1] + fib[i - 2]即可

方法二递归
主要代码
int f(int n)
{
	if(n <= 1)	return 1;
	return f(n - 1) + f(n - 2);
}

但是这样的话,你会发现算 f ( 5 ) f(5) f(5) 时算了很多次 f ( 3 ) f(3) f(3)
所以说我们用一个数组保存计算过的值,若还没有算过,那么再算一遍

改进后的主要代码
int fib[10000010];
int f(int n)
{
	if(f[n] != 0)	return fib[n];
	if(n <= 1)	return fib[n] = 1;
	return fib[n] = f(n - 1) + f(n - 2);
}
方法三矩阵

就是矩阵的一些运算

代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod (long long)(1e9 + 7)
void multiply(int F[2][2],int M[2][2])
{
	int x = F[0][0] * M[0][0] + F[0][1] * M[1][0];
	int y = F[0][0] * M[0][1] + F[0][1] * M[1][1];
	int z = F[1][0] * M[0][0] + F[1][1] * M[1][0];
	int w = F[1][0] * M[0][1] + F[1][1] * M[1][1];
	F[0][0] = x % mod;
	F[0][1] = y % mod;
	F[1][0] = z % mod;
	F[1][1] = w % mod;
}
void power(int F[2][2],int n)
{
	if(n == 0 || n == 1)	return;
	int M[2][2] = {{1,1},{1,0}};
	power(F,n / 2);
	multiply(F,F);
	if(n % 2 != 0)	multiply(F,M);
}
int fib(int n)
{
	int F[2][2] = {{1,1},{1,0}};
	if(n == 0)	return 0;
	power(F,n - 1);
	return F[0][0] %= mod;
}
signed main()
{
    long long n;
    cin >> n;
    cout << fib(n) << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿Eason

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值