文章目录
- 题目
- 思路
- 代码
- 复杂度分析
- 时间复杂度
- 空间复杂度
- 总结
题目
题目链接🔗
斐波那契数列指的是这样一个数列: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)
总结
预处理+前缀和