题意:

  求一个递推式(不好怎么概括。。)的函数的值。

  即 f(n)=a1f(n-1)+a2f(n-2)+...+adf(n-d);

SOL:

  根据矩阵乘法的定义我们可以很容易地构造出矩阵,每次乘法即可求出下一位f(n)的值并在距震中保存f(n)-----f(n-d+1)。

  像我这种傻逼看错好几次运算法则的人 = =

  第一道矩乘对着老人家模板打得几乎一模一样-----只是觉得他的写法比较优雅= =(虽然我感觉那么多memcpy会不会让常数很大。。。)

CODE:

  

  1. /*==========================================================================
  2. # Last modified: 2016-03-03 21:11
  3. # Filename: uva10870.cpp
  4. # Description:
  5. ==========================================================================*/
  6. #define me AcrossTheSky
  7. #include <cstdio>
  8. #include <cmath>
  9. #include <ctime>
  10. #include <string>
  11. #include <cstring>
  12. #include <cstdlib>
  13. #include <iostream>
  14. #include <algorithm>
  15.  
  16. #include <set>
  17. #include <map>
  18. #include <stack>
  19. #include <queue>
  20. #include <vector>
  21.  
  22. #define lowbit(x) (x)&(-x)
  23. #define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
  24. #define FORP(i,a,b) for(int i=(a);i<=(b);i++)
  25. #define FORM(i,a,b) for(int i=(a);i>=(b);i--)
  26. #define ls(a,b) (((a)+(b)) << 1)
  27. #define rs(a,b) (((a)+(b)) >> 1)
  28. #define getlc(a) ch[(a)][0]
  29. #define getrc(a) ch[(a)][1]
  30.  
  31. #define maxn 100
  32. #define maxm 100000
  33. #define pi 3.1415926535898
  34. #define _e 2.718281828459
  35. #define INF 1070000000
  36. using namespace std;
  37. typedef long long ll;
  38. typedef unsigned long long ull;
  39.  
  40. template<class T> inline
  41. void read(T& num) {
  42. bool start=false,neg=false;
  43. char c;
  44. num=0;
  45. while((c=getchar())!=EOF) {
  46. if(c=='-') start=neg=true;
  47. else if(c>='0' && c<='9') {
  48. start=true;
  49. num=num*10+c-'0';
  50. } else if(start) break;
  51. }
  52. if(neg) num=-num;
  53. }
  54. /*==================split line==================*/
  55. typedef long long Matrix[maxn][maxn];
  56. typedef long long Vector[maxn];
  57. int n,m,d,sz;
  58. void matrix_mul(Matrix A,Matrix B,Matrix res){
  59. Matrix C;
  60. memset(C,0,sizeof(C));
  61. FORP(i,0,sz-1)
  62. FORP(j,0,sz-1)
  63. FORP(k,0,sz-1)C[i][j]=(C[i][j]+A[i][k]*B[k][j])%m;
  64. memcpy(res,C,sizeof(C));
  65. }
  66. void matrix_pow(Matrix A,int n,Matrix res){
  67. Matrix a,r;
  68. memcpy(a,A,sizeof(a));
  69. memset(r,0,sizeof(r));
  70. FORP(i,0,sz-1) r[i][i]=1;
  71. while (n){
  72. if (n&1) matrix_mul(r,a,r);
  73. n >>= 1;
  74. matrix_mul(a,a,a);
  75. }
  76. memcpy(res,r,sizeof(r));
  77. }
  78. void transform(Vector d,Matrix A,Vector res){
  79. Vector r;
  80. memset(r,0,sizeof(r));
  81. FORP(i,0,sz-1)
  82. FORP(j,0,sz-1) r[j]=(r[j]+d[i]*A[i][j])%m;
  83. memcpy(res,r,sizeof(r));
  84. }
  85. int main(){
  86. while (scanf("%d%d%d",&d,&n,&m)!=EOF){
  87. if (d==0 && n==0 && m==0) return 0;
  88. Matrix A;
  89. Vector a,f;
  90. FORP(i,0,d-1) { read(a[i]); a[i]%=m;}
  91. FORM(i,d-1,0) { read(f[i]); f[i]%=m;}
  92. memset(A,0,sizeof(A));
  93. FORP(i,0,d-1) A[i][0]=a[i];
  94. FORP(i,1,d-1) A[i-1][i]=1;
  95.  
  96. sz=d;
  97. matrix_pow(A,n-d,A);
  98. transform(f,A,f);
  99. cout << f[0] << endl;
  100. }
  101. }

UVa 10870 & 矩阵快速幂的更多相关文章

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

    给出一个d阶线性递推关系,求f(n) mod m的值. , 求出An-dv0,该向量的最后一个元素就是所求. #include <iostream> #include <cstdio ...

  2. UVA - 11149 (矩阵快速幂+倍增法)

    第一道矩阵快速幂的题:模板题: #include<stack> #include<queue> #include<cmath> #include<cstdio ...

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

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

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

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

  5. POJ-3070Fibonacci(矩阵快速幂求Fibonacci数列) uva 10689 Yet another Number Sequence【矩阵快速幂】

    典型的两道矩阵快速幂求斐波那契数列 POJ 那是 默认a=0,b=1 UVA 一般情况是 斐波那契f(n)=(n-1)次幂情况下的(ans.m[0][0] * b + ans.m[0][1] * a) ...

  6. uva 10518 - How Many Calls?(矩阵快速幂)

    题目链接:uva 10518 - How Many Calls? 公式f(n) = 2 * F(n) - 1, F(n)用矩阵快速幂求. #include <stdio.h> #inclu ...

  7. Tribonacci UVA - 12470 (简单的斐波拉契数列)(矩阵快速幂)

    题意:a1=0;a2=1;a3=2; a(n)=a(n-1)+a(n-2)+a(n-3);  求a(n) 思路:矩阵快速幂 #include<cstdio> #include<cst ...

  8. UVA - 10689 Yet another Number Sequence 矩阵快速幂

                      Yet another Number Sequence Let’s define another number sequence, given by the foll ...

  9. UVA - 10229 Modular Fibonacci 矩阵快速幂

                                 Modular Fibonacci The Fibonacci numbers (0, 1, 1, 2, 3, 5, 8, 13, 21, 3 ...

随机推荐

  1. NYOJ题目1051simone牌文本编辑器

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsgAAAKFCAIAAABeD4iTAAAgAElEQVR4nO3dO3LjOtOA4X8TzrUQx1

  2. hdu 4911Inversion

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 题意:给定一个序列和k,求在k次交换之后序列的逆序数,只能相邻两个数交换且只有左边的数大于右边时才能 ...

  3. IIS网站发布若干问题

    1.Win7 64位 IIS未能加载文件或程序集"System.Data.SQLite"或它的某一个依赖项   未能加载文件或程序集"System.Data.SQLite ...

  4. Multiple types were found that match the controller named 'Home'. (weird error)

    found the error, because I changed the namespace and assembly name, then on the bin folder the old d ...

  5. [读书笔记] Web 前端开发修炼之道

    原创地址:http://www.cnblogs.com/bnbqian/p/3735565.html 转载请注明出处 今天我们要读的书是Web 前端开发修炼之道 第1章 从网站重构说起 1.1 糟糕的 ...

  6. ThinkPHP中getField( )和field( )

    做数据库查询的时候,比较经常用到这两个,总是查手册,记不住,现在把它总结下,希望以后用的时候不查手册了. 不管是用select 查询数据集,还是用find 查询数据,常配合连贯操作where.fiel ...

  7. HR外包系统 - 工资计算-几种常见账单计算规则

    01-正常工资计税 (包括同一月多地计税方式) 02-年终奖计税 (包括可分批发放,但计税总额不变)  按工资 除以月份,看落在那个计税区间,获取税率和扣除数,再用总额*税率-扣除数,要考虑当月工资如 ...

  8. JFreeChart 使用一 饼图之高级特性

    原文链接:http://www.cnblogs.com/jtmjx/archive/2013/04/23/jfreechart_advantage.html 本文主要讲解JFreeChart中饼图的一 ...

  9. 学习linux内核时常碰到的汇编指令(1)

     转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符. ...

  10. ASP.NET MVC使用过滤器进行权限控制

    1.新建MVC项目 2.找到Models文件夹,新建 LoginCheckFilterAttribute 类 public class LoginCheckFilterAttribute : Acti ...