zoukankan      html  css  js  c++  java
  • HDU 5950 Recursive sequence(矩阵快速幂)题解

    思路:一开始不会n^4的推导,原来是要找n和n-1的关系,这道题的MOD是long long 的,矩阵具体如下所示

    最近自己总是很坑啊,代码都瞎吉坝写,一个long long的输入写成%d一直判我TLE,一度怀疑矩阵快速幂地复杂度orz

    代码:

    #include<set>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #define ll long long
    const int maxn = 7;
    const ll MOD = 2147493647;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    struct Mat{
        ll s[maxn][maxn];
    };
    
    Mat mul(Mat a,Mat b){
        Mat t;
        memset(t.s,0,sizeof(t));
        for(int i = 0;i < maxn;i++){
            for(int j = 0;j < maxn;j++){
                for(int k = 0;k < maxn;k++){
                    t.s[i][j] = (t.s[i][j] + a.s[i][k]*b.s[k][j])%MOD;
                }
            }
        }
        return t;
    }
    Mat pow_mat(Mat p,int n){
        Mat ret;
        memset(ret.s,0,sizeof(ret.s));
        for(int i = 0;i < maxn;i++)
            ret.s[i][i] = 1;
        while(n){
            if(n & 1) ret = mul(ret,p);
            p = mul(p,p);
            n >>= 1;
        }
        return ret;
    }
    int main(){
        ll T,a,b,n;
        Mat A,B,C;
        memset(A.s,0,sizeof(A.s));
        A.s[0][0] = A.s[0][2] = A.s[1][0] = A.s[2][2] = A.s[3][3] = A.s[4][4] = A.s[5][5] = 1;
        for(int i = 0;i < 7;i++)
            A.s[i][6] = 1;
        A.s[1][6] = 0;
        A.s[0][1] = A.s[4][5] = 2;
        A.s[3][4] = A.s[3][5] = 3;
        A.s[0][3] = A.s[0][5] = A.s[2][3] = A.s[2][5] = 4;
        A.s[0][4] = A.s[2][4] = 6;
        /*for(int i = 0;i < 7;i++){
            for(int j = 0;j < 7;j++){
                printf("%d ",A.s[i][j]);
            }
            printf("
    ");
        }*/
        scanf("%lld",&T);
        while(T--){
            scanf("%lld%lld%lld",&n,&a,&b);
            if(n == 1){
                printf("%lld
    ",a);
            }
            else if(n == 2){
                printf("%lld
    ",b);
            }
            else{
                C = pow_mat(A,n - 2);
                ll ans = 0;
                ans = (C.s[0][0]*b%MOD + C.s[0][1]*a%MOD + C.s[0][2]*16%MOD +
                       C.s[0][3]*8%MOD + C.s[0][4]*4%MOD + C.s[0][5]*2%MOD + C.s[0][6])%MOD;
                printf("%lld
    ",ans);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    Vue 实时过去 页面宽高
    css 全网页呈现灰色
    Vue 省市区三级联动(基于ElementUI)
    小程序 节流函数 (防止按钮重复点击)
    Vs Code 自动编译TS
    VS2019 调试时出现:正试图在 os 加载程序锁内执行托管代码
    SQLServer 日期函数大全
    SQL 日期函数
    SQL Server 查询性能异常语句
    SQL中多表连接delete删除表数据
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9408757.html
Copyright © 2011-2022 走看看