https://www.luogu.org/problemnew/show/P1939

矩阵快速幂

斐波那契数列

首先看一下斐波那契数列的矩阵快速幂求法:

有一个矩阵1*2的矩阵|f[n-2],f[n-1]|,要使它乘一个2*2的矩阵,使得到的矩阵为|f[n-1],f[n]|,即|f[n-1],f[n-2]+f[n-1]|

则该矩阵为

0  1

1  1

第一行第一列:f[n-2]*0+f[n-1]*1=f[n-1]

第一行第二列:f[n-2]*1+f[n-1]*1=f[n]

同理,对于本题:

有一个矩阵1*3的矩阵|f[n-3],f[n-2],f[n-1]|,要使它乘一个3*3的矩阵,使得到的矩阵为|f[n-2],f[n-1],f[n]|,即|f[n-2],f[n-1],f[n-3]+f[n-1]|

那么这个矩阵为

0  0  1

1  0  0

0  1  1

代码

 #include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const ll RQY = ;
ll t,n;
struct Matrix
{
ll m[][];
} A,ANS,One;
Matrix times(Matrix X,Matrix Y)
{
Matrix Ans;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
Ans.m[i][j]=(X.m[i][]*Y.m[][j]%RQY+X.m[i][]*Y.m[][j]%RQY+X.m[i][]*Y.m[][j]%RQY)%RQY;
return Ans;
}
Matrix qpow(Matrix X,ll k)
{
Matrix S=One;
while(k)
{
if(k&) S=times(S,X);
k>>=;
X=times(X,X);
}
return S;
}
int main()
{
scanf("%lld",&t);
One.m[][]=;
One.m[][]=;
One.m[][]=;
A.m[][]=;
A.m[][]=;
A.m[][]=;
A.m[][]=;
while(t--)
{
scanf("%lld",&n);
n-=;
ANS=qpow(A,n);
printf("%lld\n",(ANS.m[][]+ANS.m[][]+ANS.m[][])%RQY);
}
}

【洛谷P1939】 矩阵加速模板的更多相关文章

  1. 洛谷 P1939 矩阵加速(数列)

    题意简述 \(a[1]=a[2]=a[3]=1\) \(a[x]=a[x−3]+a[x−1](x>3)\) 求a数列的第n项对1000000007取余的值. 题解思路 矩阵加速 设\[ F=\b ...

  2. 洛谷 [P1939] 矩阵加速数列

    矩阵快速幂模版 #include <iostream> #include <cstring> #include <cstdlib> #include <alg ...

  3. 【洛谷P3369】【模板】普通平衡树题解

    [洛谷P3369][模板]普通平衡树题解 题目链接 题意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3 ...

  4. 洛谷 P1939 【模板】矩阵加速(数列) 解题报告

    P1939 [模板]矩阵加速(数列) 题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值 ...

  5. [洛谷P1939]【模板】矩阵加速(数列)

    题目大意:给你一个数列a,规定$a[1]=a[2]=a[3]=1$,$a[i]=a[i-1]+a[i-3](i>3)$求$a[n]\ mod\ 10^9+7$的值. 解题思路:这题看似是很简单的 ...

  6. 【洛谷4721】【模板】分治FFT(CDQ分治_NTT)

    题目: 洛谷 4721 分析: 我觉得这个 "分治 FFT " 不能算一种特殊的 FFT ,只是 CDQ 分治里套了个用 FFT (或 NTT)计算的过程,二者是并列关系而不是偏正 ...

  7. 【洛谷3865】 【模板】ST表(猫树)

    传送门 洛谷 Solution 实测跑的比ST表快!!! 这个东西也是\(O(1)\)的,不会可以看我上一篇Blog 代码实现 代码戳这里

  8. 洛谷P1939【模板】矩阵加速(数列)+矩阵快速幂

    思路: 这个 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 可以想成: [a(n) ] [1 0 1] [a(n-1)   ] [a(n-1) ] =    ...

  9. 洛谷 P1939 【模板】矩阵加速(数列)

    题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值. 输入输出格式 输入格式: 第一行一 ...

随机推荐

  1. appium连接夜神模拟器方法总结

    使用appium连接模拟器前提条件:appium环境已经搭建完毕,搭建步骤请参考我的博客:appium手机自动化环境搭建 1.下载并安装夜神模拟器:https://www.yeshen.com/ 2. ...

  2. Tab 插件(一)

    前言 使用Jquery封装插件,使代码复用不需要每个功能重新编写代码只需修改传入参数. jQuery 插件常见到有类开发 和对象开发模式, 在下边介绍两种模式使用,初次编写,有误拍砖. jQuery ...

  3. CSS 样式分类

    CSS样式可以分为三大类:内联样式.内部样式表和外部样式表 1.内联样式(样式写在html标签里,只对该标签的内容起作用) <span style="color:red;font-si ...

  4. Unity 在Inspector面板,脚本前面的激活对勾

    写个脚本,把它挂在一个游戏对象上: using System.Collections; using System.Collections.Generic; using UnityEngine; pub ...

  5. 安卓压力测试之monkey

    步骤: 1.把要测试的apk包放在 SDK-platfrom-tools下 2.配置adb.exe的环境变量 3.手机连接上电脑(虚拟机和真机只能连接一个) 4.运行:adb devices   查看 ...

  6. swing线程机制

    在介绍swing线程机制之前,先介绍一些背景概念. 背景概念 同步与异步:     同步是指程序在发起请求后开始处理事件并等待处理的结果或等待请求执行完毕,在此之前程序被阻塞(block)直到请求完成 ...

  7. apache2.2多域名绑定

    apache2.2多域名绑定不同目录,将代码放在httpd.conf最后 NameVirtualHost *:80 <VirtualHost *:80> ServerName wo.com ...

  8. 在线编辑word文档 可保存到服务器

    使用说明:该方法只在office xp 和 2003上 测试通过,2000及以下 版本没试. 注意:你要打开的服务器端的word文档要有写权限.iis要开起 web服务扩展中的webdav为允许 具体 ...

  9. NodeJS 开发应用

    NodeJS 开发应用 使用的 Node 版本: V8.11.4 开发工具: VSCode 1.27.1 系统: Deepin 15.7 Desktop x64 项目结构 项目结构 Project i ...

  10. shell脚本的使用

    $#  返回命令行参数个数 $n  接受终端指定位置参数 $*  接受终端所有参数(不包含 $0) $@  接受终端所有参数(不包含 $0,在for循环时和 $* 的表现有差异) $?  返回上一次程 ...