矩陣乘法來加速遞推式計算
阿新 • • 發佈:2018-09-03
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 longans=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 { 25long 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 }
矩陣乘法來加速遞推式計算