矩阵乘法来加速递推式计算

Codevs1281:

给你6个数,m, a, c, x0, n, g

Xn+1 = ( aXn + c ) mod m,求Xn

计算递推式,运用矩阵来进行计算加速

然后注意用类似快速幂的方法写一个快速加,避免溢出

怎么把式子化成矩阵,日后再补

 1 #include<cstdio>
 2 long long mod,a,c,x0,n,g;
 3 struct Mat
 4 {
 5     long long m[2][2];
 6 }base,X0;
 7 long long quick_add(long long a,long long b)
 8 {
 9     long long ans=0;
10     a%=mod;b%=mod;
11     while(b>0)
12     {
13         if(b&1) ans=(ans+a)%mod;
14         a=(a+a)%mod;
15         b>>=1;
16     }
17     return ans;
18 }
19 Mat mul(Mat a,Mat b)
20 {
21     Mat ans;
22     for(int i=0;i<2;i++)
23         for(int j=0;j<2;j++)
24         {
25             long long sum=0;
26             for(int k=0;k<2;k++)
27                 sum=(sum+quick_add(a.m[i][k],b.m[k][j]))%mod;
28             ans.m[i][j]=sum;
29         }
30     return ans;
31 }
32 Mat pow(Mat a,long long n)
33 {
34     Mat p={{1,0,0,1}};
35     while(n>0)
36     {
37         if(n&1) p=mul(p,a);
38         a=mul(a,a);
39         n/=2;
40     }
41     return p;
42 }
43 int main()
44 {
45     scanf("%lld%lld%lld%lld%lld%lld",&mod,&a,&c,&x0,&n,&g);
46     base=(Mat){{a,0,1,1}};
47     X0=(Mat){{x0,c,0,0}};
48     Mat ans=mul(X0,pow(base,n));
49     printf("%lld\n",ans.m[0][0]%g);
50     return 0;
51 }

原文地址:https://www.cnblogs.com/aininot260/p/9580434.html

时间: 2024-11-05 20:45:02

矩阵乘法来加速递推式计算的相关文章

HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a line, while John writes two positive numbers

POJ3070 Fibonacci(矩阵快速幂加速递推)【模板题】

题目链接:传送门 题目大意: 求斐波那契数列第n项F(n). (F(0) = 0, F(1) = 1, 0 ≤ n ≤ 109) 思路: 用矩阵乘法加速递推. 算法竞赛进阶指南的模板: #include <iostream> #include <cstring> using namespace std; const int MOD = 10000; void mul(int f[2], int base[2][2]) { int c[2]; memset(c, 0, sizeof

hiho 1143 矩阵快速幂 求递推式

题目链接: hihocoder 1143 思路见题目上 快速幂模板: // m^n % k int quickpow(int m,int n,int k) { int b = 1; while (n > 0) { if (n & 1) b = (b*m)%k; n = n >> 1 ; m = (m*m)%k; } return b; } 题解: #include<iostream> #include<cstdio> #include<cstring

矩阵乘法优化线性递推

矩阵乘法是线性代数中一块很重要的内容.矩阵乘法的定义很奇怪[1],但正是这种奇怪的性质,让矩阵乘法成为在除了线性代数和其衍生学科(还有诸如矩阵力学之类)外最广泛使用的关于矩阵变换的应用.(什么?FFT不属于矩阵变换吧...) 注: [1]: 矩阵乘法有另外的很多定义,如未说明,指的是中间不带符号的矩阵乘法,即一般矩阵乘积.另有 标量乘积(即所有数乘上一个固定的数),阿达马乘积等,没有那么诡异,但是在大多数问题的用途上也不大. 你不会矩阵乘法?没关系,下一篇会写到的 矩阵乘法的本质 矩阵乘法的本质

题目1081:递推数列 (矩阵快速幂解递推式)

题目1081:递推数列 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5885 解决:800 题目描述: 给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q.这里n >= 2. 求第k个数对10000的模. 输入: 输入包括5个整数:a0.a1.p.q.k. 输出: 第k个数a(k)对10000的模. 样例输入: 20 1 1 14 5 样例输出: 8359 来源: 2009年清华大学计算机研究生机试真题 1 #include<stdio.h> 2 #

矩阵乘法(四):分析问题,确定递推式,采用矩阵快速幂求解

应用矩阵快速幂运算可以解决递推问题.在实际应用中,有时候题目并没有直接给出递推式,需要认真分析问题,找出递推式,然后再利用矩阵快速幂运算加快问题的求解. [例1]程序阅读理解. 有如下的C语言程序: #include <stdio.h>int main(){     int n,m,f,i;     while(scanf("%d%d",&n,&m)!=EOF)     {           f=0;           for(i=1;i<=n;i

[LGOJ]P1939【模板】矩阵加速(数列)[矩阵加速递推]

题面 矩阵加速递推的原理: 首先你得会矩阵乘法与快速幂. 以斐波拉契数列为例, 要从矩阵A \[ \begin{bmatrix} f[n-1] & f[n]  \end{bmatrix} \] 得到矩阵B \[ \begin{bmatrix} f[n] & f[n+1]  \end{bmatrix} \] 显然可以\[\begin{bmatrix} f[n-1] & f[n] \end{bmatrix}\times \begin{bmatrix}  0 & 1\\ 1 &a

矩阵经典题目七:Warcraft III 守望者的烦恼(矩阵加速递推)

https://www.vijos.org/p/1067 很容易推出递推式f[n] = f[n-1]+f[n-2]+......+f[n-k]. 构造矩阵的方法:构造一个k*k的矩阵,其中右上角的(k-1)*(k-1)的矩阵是单位矩阵,第k行的每个数分别对应f[n-1],f[n-2],,f[n-k]的系数.然后构造一个k*1的矩阵,它的第i行代表f[i],是经过直接递推得到的.设ans[][]是第一个矩阵的n-k次幂乘上第二个矩阵,f[n]就是ans[k][1]. 注意:用__int64 #in

hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)

题意:有一个递推式f(x) 当 x < 10    f(x) = x.当 x >= 10  f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 * f(x-10) 同时ai(0<=i<=9) 不是 0 就是 1: 现在给你 ai 的数字,以及k和mod,请你算出 f(x)%mod 的结果是多少 思路:线性递推关系是组合计数中常用的一种递推关系,如果直接利用递推式,需要很长的时间才能计算得出,时间无法承受,但是现在我们已知