$loj$10222 佳佳的$Fibonacci$ 矩阵快速幂
正解:矩阵快速幂
解题报告:
一看到这个就应该能想到矩阵快速幂?
然后就考虑转移式,发现好像直接想不好想,,,主要的问题在于这个*$i$,就很不好搞$QAQ$
其实不难想到,$\sum_{i=1}^{n}a_i\cdot(n-i)$这样一个式子是可以在矩阵快速幂中推出来的(类似这个形式的都可,,,就随着编号递增系数递减这样子$QwQ$
具体来说就是表示成$\sum_{i=1}^{n}\sum_{j=1}^{i}a_j$,就欧克辣(具体实现后面港,,,
但是问题在于,它是$\sum_{i=1}^{n}a_i\cdot i$这样的,就随着编号递增系数递增这样子的$QwQ$
那显然就想到,变形嘛,就变成$\sum_{i=1}^{n}a_i\cdot n-\sum_{i=1}^{n}a_i\cdot(n-i)$这样子
然后就做完辣,,,?
剩下的就是考虑怎么表示出$\sum_{i=1}^{n}a_i$和$\sum_{i=1}^{n}a_i\cdot(n-i)$辣
对于第一个的话,可以考虑$\begin{bmatrix}\sum_{j=1}^{i-1} f_i \\ f_i\\ f_{i-1}\end{bmatrix}$$\cdot$$\begin{bmatrix}1 & 1 & 0\\ 0 & 1 & 1\\ 0 & 1 & 0\end{bmatrix}$,就欧克辣
然后第二个就差不多的方法,再加一维就好,$\begin{bmatrix}\sum _{j=1}^{i-1}\sum_{k=1}^{j}f_k\\ \sum_{j=1}^{i}f_j\\ f_{i+1}\\ f_{i}\end{bmatrix}$$\cdot$$\begin{bmatrix}1 & 1 & 0 & 0\\ 0 & 1 & 1 & 0\\ 0 & 0 & 1 & 1\\0 & 0 & 1 & 0\end{bmatrix}$
欧克做完辣,,,
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define int long long
#define gc getchar()
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i) int n,mod;
struct matrix{int mat[][];il void clr(){memset(mat,,sizeof(mat));}}e1,e2,fib; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il matrix multi(matrix gd,matrix gs)
{
matrix ret;ret.clr();
rp(i,,)
rp(j,,)
rp(k,,)ret.mat[i][j]=(ret.mat[i][j]+gd.mat[i][k]*gs.mat[k][j]%mod)%mod;
return ret;
}
il matrix power_1(ri x)
{matrix ret;ret.clr();ret.mat[][]=;while(x){if(x&)ret=multi(ret,e1);e1=multi(e1,e1);x>>=;}return ret;}
il matrix power_2(ri x)
{matrix ret;ret.clr();ret.mat[][]=;while(x){if(x&)ret=multi(ret,e2);e2=multi(e2,e2);x>>=;}return ret;}
namespace sub1
{
il void main()
{
int fib1=,fib2=,as=;
rp(i,,n){as=(as+1ll*fib1*i%mod)%mod;fib2+=fib1;fib1=fib2-fib1;if(fib2>=mod)fib2-=mod;}
printf("%lld\n",as);
}
} main()
{
// freopen("fib.in","r",stdin);freopen("fib.out","w",stdout);
n=read();mod=read();
// if(n<=100)return sub1::main(),0;
e1.clr();e1.mat[][]=;e1.mat[][]=;e1.mat[][]=;e1.mat[][]=;e1.mat[][]=;
e2.clr();e2.mat[][]=;e2.mat[][]=;e2.mat[][]=;e2.mat[][]=;e2.mat[][]=;e2.mat[][]=;e2.mat[][]=;
matrix as1=power_1(n),as2=power_2(n);
printf("%lld\n",((as1.mat[][]*n%mod-as2.mat[][])%mod+mod)%mod);
return ;
}
最后放下代码就好辣!(跑得飞慢,,,QAQ
upd:
今天交流了下,,,发现我这个方法太呆了$TT$
说个神一点儿的方法
可以发现斐波拉契数列其实有个规律,,,就 $ 1+\sum_{j=1}^{i} f_{j}=f_{i} $ (其实是这个:$\sum_{i=1}^nf_i=f_{n+2}-f_2$
设$s_i=\sum_{j=1}^i$
可以得到,$ans=n\cdot s_n-(s_{1}+s_{2}+...+s_{n-1})$
代入上面那个然后变形一下可得,$ans=n\cdot f_{n+2}-f_{n+3}+n+2$
然后就傻逼题了,懒得放代码辽太$easy$辣$QAQ$
随机推荐
- git错误——Eclipse git commit错误;Committing changes has encountered a problem An Internal error occured
背景 在使用eclipse时,使用git commit 提交代码时,出项如下错误 解决方法 在工程目录下找到 .git 文件夹 ,找到里面的 index.lock 文件,然后删掉这个文件就可以了,如下 ...
- vbox环境搭建oracle11g RAC过程
安装环境 主机操作系统:windows 10 虚拟机Vbox:两台Oracle Linux R6 U7 x86_64 Oracle Database software: Oracle11gR2 Clu ...
- Android的headerView和emptyView共存问题
今天做项目的时候,准备优化下ListView相关的东西,于是乎,需要做一个当列表无数据时,空的提醒页面.这个自然想到的是ListView的setEmptyView()方法,于是顺手就写了,可是,当我为 ...
- 深度学习——Xavier初始化方法
“Xavier”初始化方法是一种很有效的神经网络初始化方法,方法来源于2010年的一篇论文<Understanding the difficulty of training deep feedf ...
- 理解虚拟主机与VPS,云服务器CVM与云服务器ECS的区别
1.理解虚拟主机与VPS的区别:VPS与虚拟主机的区别 2.理解云服务器CVM与云服务器ECS的区别:云服务器CVM与云服务器ECS的区别 3.锐速安装一键包
- LRJ-Example-06-12-Uva572
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #include <string ...
- 在SuperSocket中启用TLS/SSL传输层加密
关键字: TLS, SSL, 传输层加密, 传输层安全, 证书使用, X509Certificate SuperSocket 支持传输层加密(TLS/SSL) SuperSocket 有自动的对TLS ...
- jieba分词工具的使用方法
作为我这样的萌新,python代码的第一步是:#coding=utf-8 环境:python3.5+jieba0.39 一.jieba包安装方法: 方法1:使用conda安装 conda instal ...
- PHP Warning: Module 'json' already loaded in Unknown on line 0
Zend加密文件.启动服务器后无法正常运行加密后的文件.处理方法: 某台服务器上跑着php 5.3.8,线上服务运行正常. 某天拆分php错误日志时,发现其中有一段连续的错误信息. [14-Feb ...
- [转]爬虫 selenium + phantomjs / chrome
目录 selenium 模块 安装 phantomjs 浏览器 安装 chromedriver 接口 安装 对比两个接口 整合使用 基本实例 常用属性方法 定位节点 节点操作 其他操作 实例解析 - ...