题目传送门

如果之前推过斐波那契数列前缀和就更好做(所以题目中给出了)。

斐波那契数列前缀和题目链接

先来推一下斐波那契数列前缀和:

\[\sum\limits_{i=1}^nf(i)
\]

其中 \(f(i)\) 表示Fibonacci数列第 \(i\) 项。

直接推式子:

记 \(s(x)=\sum\limits_{i=1}^xf(i)\)

将右边一项项展开得出

\[f(1)=1
\]

\[f(2)=1
\]

\[f(3)=f(1)+f(2)
\]

\[f(4)=f(2)+f(3)
\]

\[...
\]

\[f(n)=f(n-2)+f(n-1)
\]

这些式子左右两边分别再加回去得出

\[s(n)=1+1+f(1)+f(n-1)+2*\sum_{i=2}^{n-2}f(i)
\]

把其中一个 \(1\) 变成 \(f(1)\) 再和另一个 \(f(1)\) 加到 \(2*\sum\limits_{i=2}^{n-2}f(i)\) 里面,得出

\[s(n)=1+f(n-1)+2*\sum_{i=1}^{n-2}f(i)
\]

\[s(n)=1+f(n-1)+2*s(n-2)
\]

\[s(n)-s(n-2)-s(n-2)=1+f(n-1)
\]

\[f(n)+f(n-1)-s(n-2)=1+f(n-1)
\]

\[f(n)-s(n-2)=1
\]

\[s(n-2)=f(n)-1
\]

令 \(n-2\) 变成 \(n\) 可得

\(s(n)=f(n+2)-1\)

注意到 \(f\) 是可以直接矩阵快速幂求的。这个时候就可以在 \(\mathcal{O}(\log n)\) 的时间复杂度求得 \(s(n)\) 了。


这个时候回来看本题:

对于 \(T(n)\) 来说,\(f(n)\) 被计算了 \(n\) 次,\(f(n-1)\) 被计算了 \((n-1)\) 次...

\[T(n)=\sum\limits_{i=1}^n{f(i)*i}
\]

可以用后缀和的形式来表示这个式子,计 \(s2(i)=\sum\limits_{i=1}^n{f(i)}\)

所以上面的式子可以进一步转化成这个后缀和的形式

\[T(n)=\sum\limits_{i=1}^n{s2(i)}
\]

可是 \(n\) 又不确定,又不会推后缀和,应该怎么求呢?

不会后缀和,但是我们会前缀和啊!

用 \(s\) 表示上述式子即为

\[T(n)=\sum\limits_{i=1}^n{s(n)-s(i-1)}
\]

把 \(s(n)\) 提出来:

\[T(n)=n*s(n)-\sum\limits_{i=1}^n{s(i-1)}
\]

代入 \(s(i)=f(i+2)-1\)

\[T(n)=n*f(n+2)-n-\sum\limits_{i=1}^n{(f(i+1)-1)}
\]

把 \(\sum\) 里面的 \(-1\) 提出来

\[T(n)=n*f(n+2)-n-\sum\limits_{i=1}^n{f(i+1)}+n
\]

之后就很简单了。

\[T(n)=n*f(n+2)-n-\sum\limits_{i=2}^{n+1}{f(i)}+n
\]

\[T(n)=n*f(n+2)-n-\sum\limits_{i=2}^{n+1}{f(i)}+f(1)-f(1)+n
\]

\[T(n)=n*f(n+2)-n-\sum\limits_{i=1}^{n+1}{f(i)}-f(1)+n
\]

化简一下

\[T(n)=n*f(n+2)-s(n+1)-1
\]

\[T(n)=n*f(n+2)-(f(n+3)-1)-1
\]

\[T(n)=n*f(n+2)-f(n+3)+2
\]

矩阵快速幂求 \(f(n+2)\) 和 \(f(n+3)\) 就能 \(\mathcal{O}(\log n)\) 的时间复杂度求出 \(T(n)\) 了。

因为最后的式子里面有个减法,可以提前在减法之前加上一个 \(m\) 来防止负数取模的情况发生。

参考 \(\mathcal{Code}\)

#include<iostream>
#include<cstdio>
#define ll long long
int n,m;
struct Matrix {
ll mat[3][3];
int n,m;
void memset() {
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
mat[i][j]=0;
}
};
Matrix mul(Matrix x,Matrix y)
{
Matrix z;
z.n=x.n;
z.m=y.m;
z.memset();
for(int i=1;i<=z.n;i++)
for(int j=1;j<=z.m;j++)
for(int k=1;k<=x.m;k++)
z.mat[i][j]=(z.mat[i][j]+x.mat[i][k]*y.mat[k][j])%m;
return z;
}
Matrix qpow(Matrix base,int y)
{
Matrix ans;
ans.n=ans.m=2;
ans.memset();
for(int i=1;i<=2;i++)
ans.mat[i][i]=1;
while(y)
{
if(y&1) ans=mul(ans,base);
base=mul(base,base);
y>>=1;
}
return ans;
}
ll f(int n)
{
Matrix ans,base;
ans.n=1;
ans.m=2;
base.n=base.m=2;
ans.memset();
base.memset();
ans.mat[1][1]=1;ans.mat[1][2]=1;
base.mat[1][1]=0;base.mat[1][2]=1;
base.mat[2][1]=1;base.mat[2][2]=1;
base=qpow(base,n-2);
ans=mul(ans,base);
return ans.mat[1][2];
}
int main()
{
scanf("%d%d",&n,&m);
printf("%lld",(n*f(n+2)%m-f(n+3)+m+2)%m);
return 0;
}

LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci 题解的更多相关文章

  1. LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci

    题目链接 题目大意 $$F[i]=F[i-1]+F[i-2]\ (\ F[1]=1\ ,\ F[2]=1\ )$$ $$T[i]=F[1]+2F[2]+3F[3]+...+nF[n]$$ 求$T[n] ...

  2. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  3. LOJ #10131 「一本通 4.4 例 2」暗的连锁

    LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...

  4. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)

    题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...

  5. LOJ#10065. 「一本通 3.1 例 2」北极通讯网络

    题目链接:https://loj.ac/problem/10065 题目描述 原题来自:Waterloo University 2002 北极的某区域共有 nnn 座村庄,每座村庄的坐标用一对整数 ( ...

  6. LOJ#10106. 「一本通 3.7 例 2」单词游戏

    题目链接:https://loj.ac/problem/10106 题目描述 来自 ICPC CERC 1999/2000,有改动. 有 NNN 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词. ...

  7. LOJ #10132. 「一本通 4.4 例 3」异象石

    题目地址 LOJ 题解 神仙思路.思路参考自<算法竞赛进阶指南>. 考虑维护dfs序中相邻两个石头的距离,那么每次?的答案就是sum/2(首尾算相邻) 然后维护一下拿个平衡树/set维护一 ...

  8. LOJ 10138 -「一本通 4.5 例 1」树的统计

    树链剖分模板题,详见这篇博客.

  9. LOJ 10155 - 「一本通 5.2 例 3」数字转换

    前言 从现在开始,这个博客要写一些题解了.起初,开这个博客只是好玩一样,没事就写写CSS.JS,然后把博客前端搞成了现在这个样子.以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响, ...

随机推荐

  1. JavaScript图形实例:随机SierPinski三角形

    在“JavaScript图形实例:SierPinski三角形”中,我们介绍了SierPinski三角形的基本绘制方法,在“JavaScript图形实例:迭代函数系统生成图形”一文中,介绍了采用IFS方 ...

  2. MySQL 对window函数执行sum函数疑似Bug

    MySQL 对window函数执行sum函数疑似Bug 使用MySql的窗口函数统计数据时,发现一个小的问题,与大家一起探讨下. 环境配置: mysql-installer-community-8.0 ...

  3. 小书MybatisPlus第3篇-自定义SQL

    本文档为一个系列,前面章节: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总结 书接上回,虽然Mybatis Plu ...

  4. 利用docker部署oxidized网络设备备份系统

    随着网络设备的增多,通过人手备份网络设备倍感压力,而且效率低.有编程基础的人可能会通过Python的parimiko 或者netmiko 连接到设备操作 把文件通过ftp 上传到FTP服务器, 在通过 ...

  5. MySQL后记

    MySQL后记 这篇博客的目的是记录一些容易被忽略的MySQL的知识点,以及部分pymysql模块的注意点. MySQL中的DDL与DML DDL:数据定义语言(Data Definition Lan ...

  6. Python之爬虫(十七) Scrapy框架中Spiders用法

    Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以初始的URL初始化Request,并设 ...

  7. 02-flask项目创建及debug模式的开启

    一.flask文件的创建 打开pycharm,选择flask文件,选择相关配置,需要配置的有虚拟环境,flask文件名.如下图所示: 新建的flask文件如下所示: static:用来存放静态文件,包 ...

  8. MemoryCacheHelper与RedisCacheHelper缓存集成与测试笔记

    因为每次在新项目中需要花费大量时间在基础类库搬移.调试.为了节省时间(偷懒)就将MemoryCacheHelper/RedisHelper进行了封装 本次是关于缓存方面记录,源码请参考(包含Redis ...

  9. [spring cloud] -- 核心篇

    核心功能: 分布式/版本化配置 服务注册合发现 服务路由 服务和服务之间的调用 负载均衡 断路器 分布式消息传递 ...... 技术体系 组件 服务注册与发现组件:Eureka.Zookeeper和C ...

  10. 【翻译】.NET 5 Preview7发布

    今天,发布了.NET 5.0 Preview7.这是倒数第二个预览版本(在转移到RC之前).此时,大多数功能应该已经非常接近完成了.Single file和ARM64 intrinsics是两个花费了 ...