• hdu 1757 A Simple Math Problem (矩阵高速幂)


    这一题构造的矩阵的方法同样。

    须要注意的是。题目中a0~a9 与矩阵相乘的顺序。


    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #define N 10
    
    using namespace std;
    int mod;
    typedef long long LL;
    
    struct matrix
    {
        LL a[10][10];
    }origin;
    
    
    int n=10,m;
    
    matrix multiply(matrix x,matrix y)
    {
        matrix temp;
        memset(temp.a,0,sizeof(temp.a));
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                for(int k=0;k<n;k++)
                {
                    temp.a[i][j]+=x.a[i][k]*y.a[k][j];
                    temp.a[i][j]=(temp.a[i][j])%mod;
                }
            }
        }
        return temp;
    }
    
    matrix matmod(matrix A,int k)
    {
        matrix res;
    
        memset(res.a,0,sizeof res.a);
        for(int i=0;i<n;i++)res.a[i][i]=1;
    
        while(k)
        {
            if(k&1)
            res=multiply(res,A);
            k>>=1;
            A=multiply(A,A);
        }
        return res;
    }
    
    void print(matrix x)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            cout<<" "<<x.a[i][j];
            puts("");
        }
        printf("---------------
    ");
    }
    
    int main()
    {
        int k;
        while(scanf("%d%d",&k,&mod)!=EOF)
        {
            memset(origin.a,0,sizeof origin.a);
            for(int i=0;i<10;i++)
            {
                origin.a[i][0]=i;
            }
            //print(origin);
            matrix res;
            memset(res.a,0,sizeof res.a);
    
            for(int i=0;i<9;i++)res.a[i][i+1]=1;
            for(int i=9;i>=0;i--)scanf("%d",&res.a[9][i]);
            //print(res);
            res=matmod(res,k);
    
            matrix ans = multiply(res,origin);
    
            printf("%d
    ",ans.a[0][0]);
        }
        return 0;
    }
    


  • 相关阅读:
    Go入门笔记-14 EdgeX读取配置文件
    Go入门笔记-13 使用EdgeX日志输出
    Go入门笔记-12 输出unix时间戳
    Go入门笔记-11 Go 获取Linux系统CPU占用率
    htop使用
    Ubuntu子系统默认使用root登录
    函数参数传递数组
    c 'CRTSCTS' undeclared
    c 数组指针使用
    使用SD卡刷OpenWRT后,调整分区大小
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10634353.html
  • Copyright © 2020-2023  润新知