1. 程式人生 > >矩陣乘法來加速遞推式計算

矩陣乘法來加速遞推式計算

span code 分享 pow quic mage src .com image

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 }

矩陣乘法來加速遞推式計算