题目链接

题目大意

$$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]\ mod\ m$

$n,m<=2^{31}-1$

这题的递推式推导有点神仙,完全想不到多用两个数组来形成递推式。研究了一下一本通上面的两个辅助数组的用途然后才会推出来这个转移矩阵

还是太菜了

题解

由题目可得

 $$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[i]$并不可以形成递推式,所以可以设

$$nS[i]=nF[1]+nF[2]+nF[3]+...+nF[n]$$

\begin{align*}
p[i]&=nS[i]-T[i]\\
&=(n-1)F[1]+(n-2)F[2]+...+F[n]\\
&=p[i-1]+s[i-1]
\end{align*}

这个推导可以把$p[i-1]$和$S[i-1]$以及$p[i]$展开来,就可以很好理解为什么可以这样子化成递推式了

于是我们就得到了一个递推式

 $$p[i]=p[i-1]+s[i-1]$$

而答案即为$T[n]=nS[n]-p[N]$

有了递推式就可以使用矩阵乘法优化:

转移矩阵随便推推就出来了,也不难推

$$\left[
\begin {matrix}
p[i]\\
S[i]\\
F[i]\\
F[i-1]
\end {matrix}
\right]
*
\left[
\begin{matrix}
1&1&0&0\\
0&1&1&0\\
0&0&1&1\\
0&0&1&0
\end{matrix}
\right]
=
\left[
\begin{matrix}
p[i+1]\\
S[i+1]\\
F[i+1]\\
F[i]
\end{matrix}
\right]$$

然后就是套板子了

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <cmath>
#include <set>
#include <map> using namespace std ; #define I_int int
inline I_int read() {
I_int x = , f = ; char c = getchar() ;
while( c < '' || c > '' ) {
if( c == '-' ) f = - ;
c = getchar() ;
}
while( c >= '' && c <= '' ) {
x = x * + c -'' ;
c = getchar() ;
}
return x * f ;
}
#undef I_int #define ll long long
#define inf 0x3f3f3f3f
#define in(a) a = read()
#define out(a) printf( "%d " , a )
#define outn(a) printf( "%d\n" , a )
#define N 100010 ll mod ;
struct matrix {
ll m[ ][ ] ;
matrix() { memset( m , , sizeof( m ) ) ; }
ll *operator[] ( ll a ) { return m[ a ] ; }
matrix operator * ( matrix &x ) {
matrix ans ;
memset( ans.m , , sizeof( ans.m ) ) ;
for( int i = ; i < ; i ++ ) {
for( int j = ; j < ; j ++ ) {
for( int k = ; k < ; k ++ ) {
ans[ i ][ j ] = ( ans[ i ][ j ] + m[ i ][ k ] * x[ k ][ j ] % mod ) % mod ;
}
}
}
return ans ;
}
} A , B ; int n = read() ; void init() {
A[][]=A[][]=A[][]=A[][]=A[][]=A[][]=A[][]=;
B[][]=B[][]=B[][]=;
} matrix power( ll p ) {
matrix ans , base = A ;
for( int i = ; i < ; i ++ ) ans[ i ][ i ] = ;
while( p ) {
if( p & ) ans = ans * base ;
base = base * base ;
p >>= ;
}
return ans ;
} int main() {
scanf( "%lld" , &mod ) ;
init() ;
A = power( n - ) ;
matrix ans = A * B ;
printf( "%lld\n" , (n*ans[][]-ans[][]+mod)%mod ) ;
}

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

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

    题目传送门 如果之前推过斐波那契数列前缀和就更好做(所以题目中给出了). 斐波那契数列前缀和题目链接 先来推一下斐波那契数列前缀和: \[\sum\limits_{i=1}^nf(i) \] 其中 \ ...

  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. csv参数化,数据驱动

    首先我们要有一个接口测试用例存放的地方,我们这里用EXCEL模板管理,里面包含用例编号.入参.优先级.请求方式.url等等. 1:新建一个txt文件,命名为sjqd,后缀名改为csv,右键excel格 ...

  2. LINUX的前后台程序查看切换

    1.在Linux终端运行命令的时候,在命令末尾加上 & 符号,就可以让程序在后台运行 root@Ubuntu$ ./tcpserv01 & 2.如果程序正在前台运行,可以使用 Ctrl ...

  3. 003-Nginx 设置Header 获取真实IP

    1.X-Forwarded-For的定义: X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项.它 ...

  4. Unity 补充安装

    当需要下载 安装Unity之时没勾选的一些组件时, 1.去Unity官网点开Unity旧版本 2.找到你的Unity版本,然后只要下载Unity安装程序 3.点开安装程序,去掉已安装组件的勾选,勾选你 ...

  5. keras搭建深度学习模型的一些小tips

    定义模型两种方法:  1.sequential 类仅用于层的线性堆叠,这是目前最常用的网络架构 2.函数式API,用于层组成的有向无环图,让你可以构建任意形式的架构 from keras import ...

  6. HTML 显示/隐藏DIV的技巧(visibility与display的差别)

    参考链接:http://blog.csdn.net/szwangdf/article/details/1548807 div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白: ...

  7. 通过脚本获取form表单的数值而不是submit

    jQuery的serialize()方法通过序列化表单值,创建URL编码文本字符串,我们就可以选择一个或多个表单元素,也可以直接选择form将其序列化,如: <form action=" ...

  8. redis的5种数据结构的使用场景介绍

    一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 ...

  9. windows下docker的安装并使用

    硬件虚拟化:硬件虚拟化是一种对计算机或操作系统的虚拟.虚拟化对用户隐藏了真实的计算机硬件,表现出另一个抽象计算平台. 打开任务管理器的性能查看是否支持虚拟化技术 下载windows docker ht ...

  10. Storm集成Siddhi

    <Siddhi初探>中我们介绍了Siddhi的基本使用方法,并表示我们将把Siddhi集成到Storm中作为流任务处理引擎.本文将用<Storm初探>中的例子讲解如何集成Sid ...