zoukankan      html  css  js  c++  java
  • Power of Matrix 等比数列求和 矩阵版!

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<cmath>
    #include<map>
    #include<stack>
    #include<set>
    #include<string>
    using namespace std;
    typedef long long  LL;
    typedef unsigned long long ULL;
    #define MAXN 49
    #define MOD 10000007
    #define INF 1000000009
    const double eps = 1e-9;
    //矩阵快速幂
    int n, k;
    struct Mat
    {
        int a[MAXN][MAXN];
        Mat()
        {
            memset(a, 0, sizeof(a));
        }
        Mat operator *(const Mat& rhs)
        {
            Mat ret;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    if (a[i][j])
                    {
                        for (int t = 0; t < n; t++)
                        {
                            ret.a[i][t] = (ret.a[i][t] + a[i][j] * rhs.a[j][t])%10;
                        }
                    }
                }
            }
            return ret;
        }
        Mat operator +(const Mat& rhs)
        {
            Mat ret;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    ret.a[i][j] += (a[i][j] + rhs.a[i][j])%10;
                }
            }
            return ret;
        }
    };
    Mat e;
    Mat fpow(const Mat& m, int b)
    {
        Mat ans, tmp = m;
        for (int i = 0; i < n; i++)
            ans.a[i][i] = 1;
        while (b != 0)
        {
            if (b & 1)
                ans = tmp*ans;
            tmp = tmp * tmp;
            b >>= 1;
        }
        return ans;
    }
    Mat sum(const Mat& m, int k)
    {
        if (k == 1) return m;
        else if (k % 2 == 0)
        {
            return (e + fpow(m, k / 2)) * sum(m, k / 2);
        }
        else if (k % 2 == 1)
        {
            Mat tmp = fpow(m, k / 2 + 1);
            return    (e + tmp)*sum(m, k / 2) + tmp;
        }
    }
    
    int main()   
    {
        while (scanf("%d%d", &n,&k), n)
        {
            for (int i = 0; i < n; i++)
                e.a[i][i] = 1;
            Mat M;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    scanf("%d", &M.a[i][j]);
                    M.a[i][j] %= 10;
                }
            }
            M = sum(M, k);
            for (int i = 0; i < n; i++)
            {
                printf("%d", M.a[i][0]);
                for (int j = 1; j < n; j++)
                {
                    printf("% d", M.a[i][j]);
                }
                printf("
    ");
            }
            printf("
    ");
        }
    }
  • 相关阅读:
    NCD 2019 M. NCD Salary
    NCD 2019 H. Mr. Hamra and his quantum particles
    Codeforces Testing Round #16 C.Skier
    序列自动机(数组)
    Codeforces #640 div4 F~G (构造二连弹)
    NCD 2019 C. Hasan and his lazy students
    欧拉定理,费马小定理
    微信开发
    异常后显示错误页面
    js窗体间传值
  • 原文地址:https://www.cnblogs.com/joeylee97/p/7257257.html
Copyright © 2011-2022 走看看