• 数学:矩阵乘法加速


    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 }
  • 相关阅读:
    WebService发布到IIS
    MongDb的安装
    Linux shell编程— 命令替换
    Linux软件包管理
    Linux 管理进程
    Linux 中进程的管理
    JavaScript学习day3 (基本语法下)
    JavaScript学习day2 (基本语法上)
    JavaScript学习day1
    Python 学习
  • 原文地址:https://www.cnblogs.com/aininot260/p/9580434.html
Copyright © 2020-2023  润新知