$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$
随机推荐
- LeetCode Weekly Contest 6
leetcode现在每周末举办比赛,这是今天上午参加的比赛的题解.题目难度不算大,两个easy,一个medium,一个hard.hard题之前接触过,所以做得比较顺利. 1. Sum of Left ...
- PDM->OOM->C#实体类生成时,对Blob类型字段的处理
pdm中的Blob字段生成OOM时,自动变成了string类型,再生成实体类时也是string 如何将oom中对应的blob字段设置为Byte[]类型,目前没找到方法, 只能通过脚本,将生成后的OOM ...
- Python基础:23异常
一:概述 1:错误 错误有语法和逻辑上的区别.语法错误指示软件的结构上有错误,导致不能被解释器解释或编译器无法编译.这些错误必须在程序执行前纠正.逻辑错误可能是由于不完整或是不合法的输入所致,还可能是 ...
- Layer(Web弹窗)
Layer弹窗的用法: <script src="jQuery的路径"></script> <!-- 你必须先引入jQuery1.8或以上版本 --& ...
- hdu 4476 Cut the rope (2-pointer && simulation)
Problem - 4476 题意是,给出若干绳子,对同一根绳子只能切割一次,求出最多能获得多少长度相同的绳子. 代码中,s是最大切割长度,而当前切割长度为t/2. 代码如下: #include &l ...
- phpstorm鼠标显示问题
https://segmentfault.com/q/1010000004319802 使用phpstorm,不知道碰到了什么键,鼠标变成了一个字符那么宽的灰色色块,原来是一根很细的竖线,怎么弄?没法 ...
- js 过滤富文本标签数据
var str = '<p><code>uni-app</code> 完整支持 <code>Vue</code> 实例的生命周期,同时还新增 ...
- 【转载】Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)
概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...
- mysql基础(库、表相关)
一. mysql支持的数据类型 1.1 mysql支持的数字类型: TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767 ...
- Python--day63--图书管理系统表结构设计
pycharm中运行manage.py的工具: 1,将变更翻译成SQL语句,去数据库中执行(ORM操作过数据库后都要执行这两条命令) 2,ForeignKey会自动在属性后面加_id 3,ORM封装p ...