文章目录
- 题目
- 思路
- 代码
- 复杂度分析
- 时间复杂度
- 空间复杂度
- 总结
题目
题目链接🔗
斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89…
这个数列从第3项开始,每一项都等于前两项之和。
现在,珍珠和雪豹在玩一个好玩的游戏,首先珍珠给出第一个数字a,雪豹给出第二个数字b,他们约定在第三个数字往后的值都是前两个数字的和,他们一共会写下x个数,现在他们想问你,这x个数的和是多少?
【输入格式】
第一行输入一个T代表有
T
(
1
≤
T
≤
1
0
5
)
T(1 \leq T \leq 10^5)
T(1≤T≤105)个样例
接下来T行输入
1
≤
a
,
b
≤
1
0
9
,
3
≤
x
≤
1
0
5
1 \leq a,b \leq10^9 , 3 \leq x \leq10^5
1≤a,b≤109,3≤x≤105代表一个询问
【输出格式】
对于每个询问输出一行,答案可能很大,请对其
1
0
9
+
7
10^9+7
109+7
输入1:
1
3 7 10
输出1:
781
思路
动态规划计算斐波那契数列:
- 初始化斐波那契数列的前两项为 a a a 和 b b b。
- 使用两个数组 a 和 b 分别存储斐波那契数列的前
x
x
x 项,其中 a[i] 表示第
i
i
i 项斐波那契数列的值,b[i] 表示第
i
−
1
i-1
i−1 项前缀和。
通过递推关系 a [ i ] = a [ i − 1 ] + a [ i − 2 ] a[i] = a[i-1] + a[i-2] a[i]=a[i−1]+a[i−2] 和 b [ i ] = a [ i − 1 ] + b [ i − 1 ] b[i] = a[i-1] + b[i-1] b[i]=a[i−1]+b[i−1] 计算斐波那契数列的前 x x x 项。 - 求和并取模操作:根据题目要求,计算斐波那契数列前
x
x
x 项的和,即
a
[
1
]
+
a
[
2
]
+
…
+
a
[
x
]
a[1] + a[2] + \ldots + a[x]
a[1]+a[2]+…+a[x]。对于数字
a
a
a,前面
n
n
n项的和累计个数为
a
[
n
]
a[n]
a[n],对于数字
b
b
b,前面
n
n
n项的和累计个数为
b
[
n
]
b[n]
b[n]。由于题目要求对结果进行
1
0
9
+
7
10^9+7
109+7 的取模操作,因此在计算过程中需要对结果进行取模,以避免溢出。
代码
#include <iostream>
using namespace std;
typedef long long LL;
const long long mod=(long long)1e9+7;
LL a[1000005],b[1000005];
int main()
{
int n;
cin>>n;
a[1]=1;a[2]=1;
b[1]=0;b[2]=1;
for(int i=3;i<1000005;++i)
{
a[i]=(a[i-1]+a[i-2])%mod;
b[i]=(a[i-1]+b[i-1])%mod;
}
while(n--)
{
LL sum=0;
LL aa,bb,geshu;
scanf("%lld%lld%lld",&aa,&bb,&geshu);
printf("%lld\n",((aa*a[geshu])+(bb*b[geshu]))%mod);
}
return 0;
}
复杂度分析
时间复杂度
O ( n ) O(n) O(n)
空间复杂度
O ( n ) O(n) O(n)
总结
预处理+前缀和