LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci 题解
如果之前推过斐波那契数列前缀和就更好做(所以题目中给出了)。
先来推一下斐波那契数列前缀和:
\]
其中 \(f(i)\) 表示Fibonacci数列第 \(i\) 项。
直接推式子:
记 \(s(x)=\sum\limits_{i=1}^xf(i)\)
将右边一项项展开得出
\]
\]
\]
\]
\]
\]
这些式子左右两边分别再加回去得出
\]
把其中一个 \(1\) 变成 \(f(1)\) 再和另一个 \(f(1)\) 加到 \(2*\sum\limits_{i=2}^{n-2}f(i)\) 里面,得出
\]
\]
\]
\]
\]
\]
令 \(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)\) 次...
即
\]
可以用后缀和的形式来表示这个式子,计 \(s2(i)=\sum\limits_{i=1}^n{f(i)}\)
所以上面的式子可以进一步转化成这个后缀和的形式
\]
可是 \(n\) 又不确定,又不会推后缀和,应该怎么求呢?
不会后缀和,但是我们会前缀和啊!
用 \(s\) 表示上述式子即为
\]
把 \(s(n)\) 提出来:
\]
代入 \(s(i)=f(i+2)-1\)
\]
把 \(\sum\) 里面的 \(-1\) 提出来
\]
之后就很简单了。
\]
\]
\]
化简一下
\]
\]
\]
矩阵快速幂求 \(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 题解的更多相关文章
- 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] ...
- LOJ#10064. 「一本通 3.1 例 1」黑暗城堡
LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...
- LOJ #10131 「一本通 4.4 例 2」暗的连锁
LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...
- Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)
题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...
- LOJ#10065. 「一本通 3.1 例 2」北极通讯网络
题目链接:https://loj.ac/problem/10065 题目描述 原题来自:Waterloo University 2002 北极的某区域共有 nnn 座村庄,每座村庄的坐标用一对整数 ( ...
- LOJ#10106. 「一本通 3.7 例 2」单词游戏
题目链接:https://loj.ac/problem/10106 题目描述 来自 ICPC CERC 1999/2000,有改动. 有 NNN 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词. ...
- LOJ #10132. 「一本通 4.4 例 3」异象石
题目地址 LOJ 题解 神仙思路.思路参考自<算法竞赛进阶指南>. 考虑维护dfs序中相邻两个石头的距离,那么每次?的答案就是sum/2(首尾算相邻) 然后维护一下拿个平衡树/set维护一 ...
- LOJ 10138 -「一本通 4.5 例 1」树的统计
树链剖分模板题,详见这篇博客.
- LOJ 10155 - 「一本通 5.2 例 3」数字转换
前言 从现在开始,这个博客要写一些题解了.起初,开这个博客只是好玩一样,没事就写写CSS.JS,然后把博客前端搞成了现在这个样子.以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响, ...
随机推荐
- AT2272 [ARC066B] Xor Sum 题解
题目连接:传送门 分析 这道题只看题目中给的样例是找不出规律的 所以我们可以打一下表 1, 2, 4, 5, 8, 10, 13, 14, 18 如果你还是没有看出什么规律的话,我们可以从OEIS上搜 ...
- C# 基于内容电影推荐项目(一)
从今天起,我将制作一个电影推荐项目,在此写下博客,记录每天的成果. 其实,从我发布 C# 爬取猫眼电影数据 这篇博客后, 我就已经开始制作电影推荐项目了,今天写下这篇博客,也是因为项目进度已经完成50 ...
- Deno 学习笔记(1)安装及简单的request
Deno下载和安装 PowerShell iwr https://deno.land/x/install/install.ps1 -useb | iex Shell curl -fsSL https: ...
- 5 个 IDEA 必备插件,让效率成为习惯
IDEA 是最好的 IDE,谁赞成,谁反对? IDEA 是 Java 开发人员中最受欢迎和用户友好的 IDE 之一,它具有许多便利的功能,例如智能代码完成,自动执行繁琐的重复开发任务,因此它已成为 J ...
- windows下的包管理器scoop
scoop(传送门) 安装 scoop是一个类似于linux下apt之类包管理器 安装scoop(Powershell 3+ and .NET Framework 4.5+) iex (new-ob ...
- Maven 专题(五):Maven核心概念详解(一)
**Maven 的核心程序中仅仅定义了抽象的生命周期,而具体的操作则是由 Maven 的插件来完成的.**可是 Maven 的插件并不包含在 Maven 的核心程序中,在首次使用时需要联网下载. 下载 ...
- 数据库01 /Mysql初识、基本指令、数据库密码相关、创建用户及授权
数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 目录 数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 1. 数据库概述 2. 数据库管理系统/DBMS ...
- 数据分析06 /pandas高级操作相关案例:人口案例分析、2012美国大选献金项目数据分析
数据分析06 /pandas高级操作相关案例:人口案例分析.2012美国大选献金项目数据分析 目录 数据分析06 /pandas高级操作相关案例:人口案例分析.2012美国大选献金项目数据分析 1. ...
- saver 的保存与恢复
模型保存,先要创建一个Saver对象:saver=tf.train.Saver(), max_to_keep 是用来设置保存模型的个数,默认为5,即保存最近的五个模型,saver=tf.train.S ...
- PHP基础:(常量变量,数据类型,类型转换)
预定义变量(系统变量) $_GET:get方式提交的数据 $_POST:post方式提交的数据 $_REQUEST:$_GET,$_POST数据综合 $GLOBALS:PHP中所有的全局变量 $_SE ...