数学:矩阵乘法加速

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 }
原文地址:https://www.cnblogs.com/aininot260/p/9580434.html