题意:

  F(n) =  a1 * F(n-1) + a2 * F(n-2)+ ···· + ad * F(n-d)。

  求给你的n 。 很明显这是一道矩阵快速幂的题目。

  

题解:

  [Fn-1, Fn-2, Fn-3, ···, Fn-d] * A(矩阵) = [Fn, Fn-1, Fn-2, ···, Fn-d+1] 。

  F = 第一个矩阵 * A的第一列, 所以A矩阵的第一列为(a1, a2 , ··· ad)。

  Fn = 第一个矩阵  * A的第二列, 所以A矩阵的第二列为(1, 0, 0,···, 0)。

  同理可以推出整个A矩阵:

  a1  1  0  ···     0

  a2  0  1  ···     0

  a3  0  0  ···     0

  ···  0  0  ···   1

  ad  0  0  0  0

  当n 小于等于d 的时候 直接输出。

  [ f(d), f(d-1), f(d-2), ···, f(2), f(1) ] * An-d =  [Fn, Fn-1, Fn-2, ···, Fn-d+1] 。

  

  

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <string>
  5. #include <algorithm>
  6. #include <cmath>
  7. #include <vector>
  8. #include <queue>
  9. #include <map>
  10. #include <stack>
  11. #include <set>
  12. using namespace std;
  13. typedef long long LL;
  14. #define ms(a, b) memset(a, b, sizeof(a))
  15. #define pb push_back
  16. #define mp make_pair
  17. const LL INF = 0x7fffffff;
  18. const int inf = 0x3f3f3f3f;
  19. const int maxn = +;
  20. int mod;
  21. struct Matrix
  22. {
  23. LL c[maxn][maxn];
  24. };//Matrix 矩阵
  25. Matrix mult(Matrix a, Matrix b, int len)//矩阵乘法
  26. {
  27. Matrix hh={};
  28. for(int i=;i<len;i++)
  29. for(int j =;j<len;j++)
  30. for(int k = ;k<len;k++){
  31. hh.c[i][j] += (a.c[i][k]*b.c[k][j])%mod;
  32. hh.c[i][j] %= mod;
  33. }
  34. return hh;
  35. }
  36. Matrix qpow_Matrix(Matrix a, int b, int len)
  37. {
  38. Matrix base = a;
  39. Matrix ans;
  40. //初始化ans = 1。
  41. for(int i =;i<len;i++)
  42. for(int j =;j<len;j++)
  43. if(i==j) ans.c[i][j] = ;
  44. else ans.c[i][j] = ;
  45. //
  46. while(b){
  47. if(b&) ans = mult(ans, base, len);
  48. base = mult(base, base, len);
  49. b>>=;
  50. }
  51. return ans;
  52. }
  53. int a[maxn];
  54. int f[maxn];
  55. void solve(int d, int n, int m){
  56. mod = m;
  57. for(int i = ;i<=d;i++) cin >> a[i];
  58. for(int i = ;i<=d;i++) cin >> f[i];
  59.  
  60. Matrix begin={};
  61. for(int j = ;j<d;j++){
  62. begin.c[][j] = f[d-j]%mod;
  63. }
  64. Matrix A={};
  65. for(int j = ;j<d;j++)
  66. A.c[j][] = a[j+]%mod;
  67. for(int j = ;j<d;j++){
  68. A.c[j][j+] = ;
  69. }
  70. if(n<=d){
  71. cout << f[n]%mod << endl;
  72. return;
  73. }
  74. Matrix temp = qpow_Matrix(A, n-d, d);
  75. Matrix ans = mult(begin, temp, d);
  76. cout << ans.c[][]%mod << endl;
  77. return;
  78. }
  79. int main() {
  80. #ifdef LOCAL
  81. freopen("input.txt", "r", stdin);
  82. // freopen("output.txt", "w", stdout);
  83. #endif
  84. // ios::sync_with_stdio(0);
  85. // cin.tie(0);
  86. int d, n, m;
  87. while(cin >> d >> n >> m){
  88. if(d+n+m==) break;
  89. solve(d, n, m);
  90. }
  91. return ;
  92. }

UVA10870 Recurrences (矩阵快速幂及构造方法详解)的更多相关文章

  1. UVA10870 Recurrences —— 矩阵快速幂

    题目链接:https://vjudge.net/problem/UVA-10870 题意: 典型的矩阵快速幂的运用.比一般的斐波那契数推导式多了几项而已. 代码如下: #include <bit ...

  2. UVa 10870 Recurrences (矩阵快速幂)

    题意:给定 d , n , m (1<=d<=15,1<=n<=2^31-1,1<=m<=46340).a1 , a2 ..... ad.f(1), f(2) .. ...

  3. UVA10870—Recurrences(简单矩阵快速幂)

    题目链接:https://vjudge.net/problem/UVA-10870 题目意思: 给出a1,a2,a3,a4,a5………………ad,然后算下面这个递推式子,简单的矩阵快速幂,裸题,但是第 ...

  4. UVA - 10870 Recurrences 【矩阵快速幂】

    题目链接 https://odzkskevi.qnssl.com/d474b5dd1cebae1d617e6c48f5aca598?v=1524578553 题意 给出一个表达式 算法 f(n) 思路 ...

  5. HDU 2842 (递推+矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...

  6. BNU29139——PvZ once again——————【矩阵快速幂】

    PvZ once again Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java cla ...

  7. DecodingGenome(CodeForces-222E)【矩阵快速幂】

    题目链接:https://vjudge.net/contest/333591#problem/L 题意:用m个字符构成长度为n的串,其中存在形如“ab”(表示a后不能放置b)的条件约束,问共有多少种构 ...

  8. [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化

    这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...

  9. POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂

    这两题属于AC自动机的第二种套路通过矩阵快速幂求方案数. 题意:给m个病毒字符串,问长度为n的DNA片段有多少种没有包含病毒串的. 根据AC自动机的tire图,我们可以获得一个可达矩阵. 关于这题的t ...

随机推荐

  1. Python笔记(二十五)_魔法方法_描述符

    描述符的属性方法 __get__(self, instance, owner): 用于访问属性,返回属性的值 __set__(self, instance, value): 用于给属性赋值时,返回属性 ...

  2. 阅读jdk源码的流程(从今天开始要阅读jdk源码)

    1.java.lang 2.java.util 3.java.util.concurrent 4.java.util.concurrent.atomic 5.java.lang.reflect 6.j ...

  3. web 前端3 javascript基础

    JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一.如何编写 1.J ...

  4. ### Error building SqlSession. ### The error may exist in SQL Mapper Configuration ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibat

    这是一个由粗心导致的错误,具体报错如下: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSessio ...

  5. 使用ssh协议在linux主机之间快速上传和下载文件

    scp 要上传的文件 上传主机用户名@主机地址:要上传的主机目录 例如: scp *20181111*.gz inas@10.2.13.57:/INAS/dsgbak/20181110 表示将当前目录 ...

  6. 防止 iframe 的链接重定向父级页面

    项目中发现,多系统通过iframe嵌套时,如果iframe的请求是重定向会导致父级页面重定向,怎么破? 查找MDN(https://developer.mozilla.org/zh-CN/docs), ...

  7. 2019牛客暑期多校训练营(第三场) - J - LRU management - 模拟

    https://ac.nowcoder.com/acm/contest/883/J 根据这个数据结构的特点,也就是计算机组成原理里面学过的cache的LRU管理算法,每次访问都会在cache中查询一页 ...

  8. 计算机体系结构——流水线技术(Pipelining)

    本文导读: 一.并行技术 .并行技术分类 .新技术的设计与实现 .指令周期 二.流水线技术 .什么是流水线 .指令重叠方式 .流水工作设计 .流水线的描述方法(时空图) .流水线特点 三.流水线的分类 ...

  9. markdown简介及基本语法

    一.前言 Markdown是一种轻量级标记语言,它以纯文本形式(易读.易写.易更改)编写文档,并最终以HTML格式发布. Markdown也可以理解为将以MARKDOWN语法编写的语言转换成HTML内 ...

  10. js实现-小框框全选

    点击全选下面单独的肉也会全选,再次点击取消 一个一个点击肉,点完--全选也会被选上 HTML代码---CSS略 <table> <tr> <th> <inpu ...