zoukankan      html  css  js  c++  java
  • hdu 4686 (矩阵快速幂)

    题意:

              

             a 0 = A0 
             a i = a i-1*AX+AY 
             b 0 = B0 
             b i = b i-1*BX+BY 

             求AoD(N) mod 1000000007

    思路:

             做这道题时思路没有打开,一直纠结于如何把公式加一起.....

             正确是做法是把AoD这个和加到你的构造矩阵里来递推计算

             aibi=(Ax*Bx)*ai-1*bi-1 + (Ax*By)*ai-1 + (Ay*Bx)*bi-1 + Ay*By

            

    代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    
    using namespace std;
    
    typedef long long ll;
    const int N=5,M=5,P=5;
    const ll MOD=1000000007;
    struct  Matrix
    {
        ll m[N][N];
    };
    
    Matrix  A;
    
    Matrix  I={1,0,0,0,0,
               0,1,0,0,0,
               0,0,1,0,0,
               0,0,0,1,0,
               0,0,0,0,1};
    
    Matrix multi(Matrix a,Matrix b)
    {
        Matrix ans;
        for(int i=0;i<N;i++)
        {
           for(int j=0;j<M;j++)
           {
              ans.m[i][j]=0;
              for(int k=0;k<P;k++)
              {
                 ans.m[i][j]+=a.m[i][k]*b.m[k][j]%MOD;
              }
              ans.m[i][j]%=MOD;
           }
        }
        return ans;
    }
    
    Matrix power(Matrix a,ll k)
    {
        Matrix ans=I,p=a;
        while(k)
        {
          if(k&1)
          {
            ans=multi(ans,p);
          }
          k>>=1;
          p=multi(p,p);
        }
        return ans;
    }
    
    int main(int argc, char const *argv[])
    {
        ll n;
        ll A0,Ax,Ay,B0,Bx,By;
        while(cin>>n)
        {
            scanf("%lld %lld %lld",&A0,&Ax,&Ay);
            scanf("%lld %lld %lld",&B0,&Bx,&By);
            if(n==0)
            {
                cout<<"0"<<endl;
                continue;
            }
            A0%=MOD;
            Ax%=MOD;
            Ay%=MOD;
            B0%=MOD;
            Bx%=MOD;
            By%=MOD;
            A.m[0][0]=1;
            A.m[0][1]=(Ax*Bx)%MOD;
            A.m[0][2]=(Ax*By)%MOD;
            A.m[0][3]=(Ay*Bx)%MOD;
            A.m[0][4]=(Ay*By)%MOD;
            A.m[1][0]=0;
            A.m[1][1]=(Ax*Bx)%MOD;
            A.m[1][2]=(Ax*By)%MOD;
            A.m[1][3]=(Ay*Bx)%MOD;
            A.m[1][4]=(Ay*By)%MOD;
            A.m[2][0]=0;
            A.m[2][1]=0;
            A.m[2][2]=(Ax)%MOD;
            A.m[2][3]=0;
            A.m[2][4]=(Ay)%MOD;
            A.m[3][0]=0;
            A.m[3][1]=0;
            A.m[3][2]=0;
            A.m[3][3]=(Bx)%MOD;
            A.m[3][4]=(By)%MOD;
            A.m[4][0]=0;
            A.m[4][1]=0;
            A.m[4][2]=0;
            A.m[4][3]=0;
            A.m[4][4]=1;
            Matrix ans=power(A,(n-1));
            ll num=0;
            ll a=(A0*B0)%MOD;
            ll b=(A0*B0)%MOD;
            ll c=A0%MOD;
            ll d=B0%MOD;
            ll e=1;
            num=(num+(ans.m[0][0]*a)%MOD)%MOD;
            num=(num+(ans.m[0][1]*b)%MOD)%MOD;
            num=(num+(ans.m[0][2]*c)%MOD)%MOD;
            num=(num+(ans.m[0][3]*d)%MOD)%MOD;
            num=(num+(ans.m[0][4]*e)%MOD)%MOD;
            printf("%lld
    ",num);
        }
        return 0;
    }

               

  • 相关阅读:
    Java入门学习路线目录索引(持续更新中)
    关于技术面试,面试官会怎么考察?
    什么是REST以及 RESTful?
    程序猿一般可以从什么平台接私活
    Statement常用的方法回顾
    信息网络安全协会学习总结提交规范
    20155322 2017-2018-1 《信息安全系统设计》第五周 MyBash实现
    20155322 2017-2018-1《信息安全系统设计》第五周 学习总结
    2017-2018-1 20155322 20155327 实验一 开发环境的熟悉
    20155322 2017-2018-1《信息安全系统设计》第四周学习总结
  • 原文地址:https://www.cnblogs.com/simplekinght/p/7082232.html
Copyright © 2011-2022 走看看