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

Posted aininot260

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵乘法来加速递推式计算相关的知识,希望对你有一定的参考价值。

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
",ans.m[0][0]%g);
50     return 0;
51 }

 

以上是关于矩阵乘法来加速递推式计算的主要内容,如果未能解决你的问题,请参考以下文章

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

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

「CSPS 2019 十一」三地联考

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

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

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