zoukankan      html  css  js  c++  java
  • 常系数线性齐次递推

    //矩阵类,支持矩阵的加减乘和幂运算
    //------------------------------------------------------------------------------------
    const int MAXN = 105;
    const int MAXM = 105;
    struct Martix
    {
        int n, m;                    //n:矩阵行数         m:矩阵列数
        int a[MAXN][MAXM];
        void clear() {            //清空矩阵
            n = m = 0;
            memset(a, 0, sizeof(a));
        }
        Martix operator+(const Martix& b) const {
            Martix tmp;
            tmp.n = n; tmp.m = m;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++)
                    tmp.a[i][j] = a[i][j] + b.a[i][j];
            return tmp;
        }
        Martix operator-(const Martix& b) const {
            Martix tmp;
            tmp.n = n; tmp.m = m;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++)
                    tmp.a[i][j] = a[i][j] - b.a[i][j];
            return tmp;
        }
        Martix operator*(const Martix& b) const {
            Martix tmp;
            tmp.clear();
            tmp.n = n; tmp.m = b.m;
            for (int i = 0; i < tmp.n; i++)
                for (int j = 0; j < tmp.m; j++) 
                    for (int k = 0; k < m; k++) {
                        tmp.a[i][j] += a[i][k] * b.a[k][j];
                        tmp.a[i][j] %= mod;
                    }
            return tmp;
        }
        Martix operator^(int x)const {
            Martix base, ans;
            base = *this; 
            ans.clear(); ans.m = ans.n = n;
            for (int i = 0; i < n; i++) ans.a[i][i] = 1;
            if (x == 0) return ans;
            if (x == 1) return base;
            while (x) {
                if (x & 1) ans = ans * base;
                base = base * base;
                x >>= 1;
            }
            return ans;
        }
    };
    //------------------------------------------------------------------------------------
    //常系数线性齐次递推模板
    //a[]为常系数数组,b为初值数组,n为数组大小,t为要求解的项数
    int solve(int a[],int b[],int n,int t){
        Martix M,F,E;
        M.clear(),F.clear(),E.clear();
        M.n=M.m=n;
        E.n=E.m=n;
        F.n=n,F.m=1;
        for(int i=0;i<n-1;i++)
        M.a[i][i+1]=1;
        for(int i=0;i<n;i++){
            M.a[n-1][i]=a[i];
            F.a[i][0]=b[i];
            E.a[i][i]=1;
        }
        if(t<n) return F.a[t][0];
        for(t-=n-1;t;t/=2){
            if(t&1) E=M*E;
            M=M*M;
        }
        F=E*F;
        return F.a[n-1][0];
    }
  • 相关阅读:
    搜索回车跳转页面
    登录验证码
    【排序算法】排序算法之插入排序
    PAT 乙级 1044 火星数字 (20 分)
    PAT 甲级 1035 Password (20 分)
    PAT 甲级 1041 Be Unique (20 分)
    PAT 甲级 1054 The Dominant Color (20 分)
    PAT 甲级 1027 Colors in Mars (20 分)
    PAT 甲级 1083 List Grades (25 分)
    PAT 甲级 1005 Spell It Right (20 分)
  • 原文地址:https://www.cnblogs.com/033000-/p/10061559.html
Copyright © 2011-2022 走看看