思路:

这个

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) 】 =   【1 0 0】 * 【a(n-2)  】

a(n-2) 】   【0 1 0】 【a(n-3)   】

然后就是利用矩阵快速幂去算中间那个矩阵的n次结果

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6. typedef long long ll;
  7. const int lg= 1e9+;
  8. const int maxn = ;
  9. struct node {
  10. ll m[maxn][maxn];
  11. }ans,res;
  12.  
  13. node Mul(node a,node b,ll n)
  14. {
  15. node tmp;
  16. memset(tmp.m,,sizeof(tmp));
  17. for(int i=; i<=n; i++)
  18. {
  19. for(int j=; j<=n; j++)
  20. {
  21. for(int k=; k<=n; k++)
  22. tmp.m[i][j] = (tmp.m[i][j]+a.m[i][k]*b.m[k][j]%lg)%lg;
  23. }
  24. }
  25. return tmp;
  26. }
  27. void jzksm(ll n,ll k)
  28. {
  29. for(int i=; i<=n; i++)
  30. {
  31. for(int j=; j<=n; j++)
  32. {
  33. if(i==j)ans.m[i][j] = ;
  34. else ans.m[i][j] = ;
  35. }
  36. }
  37. while(k)
  38. {
  39. if(k&)ans = Mul(ans,res,n);
  40. res = Mul(res,res,n);
  41. k>>=;
  42. }
  43. }
  44. int main(){
  45. int t,n;
  46. scanf("%d", &t);
  47. while(t--)
  48. {
  49.  
  50. scanf("%d", &n);
  51. memset(res.m,,sizeof(res.m));
  52. res.m[][] = res.m[][] = res.m[][] = res.m[][] = ;
  53. jzksm(,n);
  54. printf("%lld\n",ans.m[][]%lg);
  55.  
  56. }
  57. return ;
  58. }

洛谷P1939【模板】矩阵加速(数列)+矩阵快速幂的更多相关文章

  1. 洛谷 P1045 【麦森数】快速幂

    不用快速幂,压位出奇迹! 本人是个蒟蒻,不太熟悉快速幂,这里给大家介绍一种压位大法. 让我们来分析一下题目,第一位是送分的,有一个专门求位数的函数:n*log10(2)+1. 然后题目中p<=3 ...

  2. 洛谷P5151 HKE与他的小朋友 快速幂/图论+倍增

    正解:矩阵快速幂/tarjan+倍增 解题报告: 传送门! 跟着神仙做神仙题系列III 这题首先一看到就会想到快速幂趴?就会jio得,哦也不是很难哦 然而,看下数据范围,,,1×105,,,显然开不下 ...

  3. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  4. 【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】

    目录: 1:一道简单题[树形问题](Bzoj 1827 奶牛大集会) 2:一道更简单题[矩阵乘法][快速幂] 3:最简单题[技巧] 话说这些题目的名字也是够了.... 题目: 1.一道简单题 时间1s ...

  5. 洛谷 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)取余的值 ...

  6. [洛谷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$的值. 解题思路:这题看似是很简单的 ...

  7. 【洛谷P1939】 矩阵加速模板

    https://www.luogu.org/problemnew/show/P1939 矩阵快速幂 斐波那契数列 首先看一下斐波那契数列的矩阵快速幂求法: 有一个矩阵1*2的矩阵|f[n-2],f[n ...

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

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

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

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

随机推荐

  1. win10下nodejs的安装及配置

    这里主要引用两篇文章,写的非常详细,也能解决你可能出现的问题 nodejs安装及配置 如何删除之前nodejs设置的 npm config set prefix .....

  2. Promise异步编程解决方案

    Promise是ES6中新增的异步编程解决方案,体现在代码中它是一个对象,可以通过 Promise 构造函数来实例化. 其最基本的使用 new Promise(function(resolve,rej ...

  3. 洛谷P1510 题解

    前言: 其实这道题挺水的,但我居然把ta想成了 贪心 啪啪打脸 好了,废话不多说. 思路: step 1:先翻译以下题意,其实就是求出最多消耗多少体力能把东海填满,如果不能填满,就输出"Im ...

  4. 【Java例题】7.5 文件题2-学生成绩统计

    5.学生成绩统计.已有一个学生成绩文件,含有多位学生的各三门课的成绩:读取这个文件中的每位学生的三门课成绩,然后计算均分:最后对这些均分按照大于或小于75分的界限,分别写到另两个文件中. packag ...

  5. Android——倒计时跳转+sharedpreferences

    public class MainActivity extends Activity { // 3秒钟后,从图1跳转到图2(10) private Handler handler=new Handle ...

  6. python 函数和函数名的应用

    一.函数 1.函数定义 def 关键字 -- 定义 func 函数名 -- 和变量定义规则一样 ()必须要写格式 : 声明语句结束 def my_len(): ​ 函数体 def func(a:int ...

  7. java NIO知多少

    背景 Linux系统中的IO操作内部相当复杂,下面是一张带图片的LinuxIO相关层级关系: 下面是一个简化版本Linux内部IO层级图: 对此我的理解,java程序员版本的IO理解: java中的I ...

  8. ArrayList用法整理

    System.Collections.ArrayList类是一个特殊的数组.通过添加和删除元素,就可以动态改变数组的长度. 一.优点 1.支持自动改变大小的功能 2.可以灵活的插入元素 3.可以灵活的 ...

  9. python面向对象初始进阶版 通过一道题带你认识面向对象

    定义一个类 class Person: #公共属性 animal='高级动物' soul='有灵魂' language='语言' def init(self,country,name,sex,age, ...

  10. Mysql5.6对时间的处理精度问题

    在业务处理需要使用new Date()来更新时间类型的字段时,数据库会对时间类型进行四舍五入处理,如果new Date()的更新时间与原时间间隔太短,数据库进行四舍五入之后,认为值没有变化,从而不更新 ...