【QED】斐波那契游戏

题目

题目链接🔗

斐波那契数列指的是这样一个数列: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(1T105)个样例
接下来T行输入 1 ≤ a , b ≤ 1 0 9 , 3 ≤ x ≤ 1 0 5 1 \leq a,b \leq10^9 , 3 \leq x \leq10^5 1a,b109,3x105代表一个询问
【输出格式】

对于每个询问输出一行,答案可能很大,请对其 1 0 9 + 7 10^9+7 109+7
输入1:

1
3 7 10

输出1:

781

思路

动态规划计算斐波那契数列:

  1. 初始化斐波那契数列的前两项为 a a a b b b
  2. 使用两个数组 a 和 b 分别存储斐波那契数列的前 x x x 项,其中 a[i] 表示第 i i i 项斐波那契数列的值,b[i] 表示第 i − 1 i-1 i1 项前缀和。
    通过递推关系 a [ i ] = a [ i − 1 ] + a [ i − 2 ] a[i] = a[i-1] + a[i-2] a[i]=a[i1]+a[i2] b [ i ] = a [ i − 1 ] + b [ i − 1 ] b[i] = a[i-1] + b[i-1] b[i]=a[i1]+b[i1] 计算斐波那契数列的前 x x x 项。
  3. 求和并取模操作:根据题目要求,计算斐波那契数列前 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)

总结

预处理+前缀和

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要实现翻页数据爬取,您可以使用`requests`库发送GET请求,并在请求中包含翻页参数。在这种情况下,您可以通过修改URL的查询字符串参数来实现翻页。 以下是一个示例代码,演示如何实现翻页数据爬取: ```python import requests import pandas as pd url = 'https://fund.eastmoney.com/data/fundranking.html' params = { 't': 'all', 'c': '0', 'r': 's1nzf', 'pn': '1', # 第一页 'ddesc': 'qsd20220721', # 开始日期 'qed': '20230721', # 结束日期 'qdii': 'zq;gg;gzbd;gzfs;bbzt;sfbb', # 类型筛选 } headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.44'} data = [] for page in range(1, 51): # 爬取前50页的数据 params['pn'] = str(page) # 更新翻页参数 response = requests.get(url, headers=headers, params=params) contents = response.text # 解析内容并提取数据 # 这里根据网页结构和数据提取规则进行解析,具体解析方法需要根据网页结构进行调整 # 以下是一个示例,您需要根据实际情况进行修改 # ... # 将提取到的数据添加到data列表中 # 创建DataFrame对象并保存为Excel df = pd.DataFrame(data) df.to_excel('data.xlsx', index=False) ``` 在上述代码中,我们使用`params`字典来设置查询字符串参数,其中`pn`表示页码。通过循环迭代来爬取每一页的数据,并将提取到的数据添加到`data`列表中。最后,我们将`data`列表转换为DataFrame对象,并保存为Excel表格。 请注意,上述代码中的数据提取部分需要根据网页结构和数据提取规则进行相应的修改。您需要查看目标网页的HTML结构,并使用适当的解析方法来提取您所需的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

想要AC的dly

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

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

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

打赏作者

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

抵扣说明:

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

余额充值