$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$
随机推荐
- Shell 基本运算符 1
Shell 和其他编程语言一样,支持多种运算符,包括: 算术运算符 关系运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr ...
- 2018-10-15-Winforms-可能遇到的-1000-个问题
title author date CreateTime categories Winforms 可能遇到的 1000 个问题 lindexi 2018-10-15 09:35:15 +0800 20 ...
- Top 10 open source projects of 2015
Top 10 open source projects of 2015 Posted 15 Dec 2015Jen Wike Huger (Red Hat)Feed 188 up 31 comment ...
- video 获取第一帧的图片作为封面
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- poj 3675 Telescope (圆与多边形面积交)
3675 -- Telescope 再来一题.这题的代码还是继续完全不看模板重写的. 题意不解释了,反正就是一个单纯的圆与多边形的交面积. 这题的精度有点搞笑.我用比较高的精度来统计面积,居然wa了. ...
- nginx 301 将不带www域名,重定向到www域名
// nginx 官方推荐 server { listen 80; server_name example.org; return 301 http://www.example.org$request ...
- 深入java面向对象四:Java 内部类种类及使用解析(转)
内部类Inner Class 将相关的类组织在一起,从而降低了命名空间的混乱. 一个内部类可以定义在另一个类里,可以定义在函数里,甚至可以作为一个表达式的一部分. Java中的内部类共分为四种: 静态 ...
- Python--day25--抽象类
什么是抽象类: 抽象类: #一切皆文件 import abc #利用abc模块实现抽象类 class All_file(metaclass=abc.ABCMeta): all_type='file' ...
- JPA多对一单向关联
在实际开发过程中,JPA多对一单向关联是使用最多的关联方式. 下面是订单与订单项的配置关系. 订单(Order):一的一方,不进行任何配置 @Entity @Table(name="orde ...
- H3C 基本ACL部署位置示例