矩阵乘法来加速递推式计算
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 守望者的烦恼(矩阵加速递推)