• 快速计算类似斐波那契数列数列的数列的第N项,矩阵快速幂


    这个题有循环节,可以不用这么做,这个可以当一个模板

    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    typedef long long ll;
    struct matrix{
        int r,c;ll m[5][5];
    };
    matrix A,B,C,D;
    int n;
    void init(){
        A.m[1][1]=3;A.m[1][2]=1;
        B.m[1][1]=1;B.m[1][2]=1;
        B.m[2][1]=-1;B.m[2][2]=0;
        A.r=1;A.c=2;
        B.r=2;B.c=2;
    }
    void multyply(matrix &A,matrix B){
        int i,j,k;
        if(A.c!=B.r) printf("err
    ");
        for(i=1;i<=A.r;++i){
            for(j=1;j<=B.c;++j){
                C.m[i][j]=0;    
                for(k=1;k<=A.c;++k){
                    C.m[i][j]+=A.m[i][k]*B.m[k][j];
                }
            }
        }
        A.c=B.c;
        for(i=1;i<=A.r;++i){
            for(j=1;j<=B.c;++j){
                A.m[i][j]=C.m[i][j];
            }
        }
    }
    void fast_pow(ll b){
        if(b==0) return;
        D.m[1][1]=1;D.m[1][2]=0;
        D.m[2][1]=0;D.m[2][2]=1;
        D.r=2;D.c=2;
        while(b){
            if(b&1){
                multyply(D,B);
            }
            multyply(B,B);
            b>>=1;
        }
        multyply(A,D);
    }
    int main(){
        int T;scanf("%d",&T);
        while(T--){
            scanf("%d",&n);
            init();
            if(n==1){
                printf("%d
    ",1);
            }
            else if(n==2){
                printf("%d
    ",4);
            }
            else{
                if(n-1==2){
                    printf("%d
    ",6);
                }
                else{
                    fast_pow(n-3);
                    printf("%I64d
    ",3+A.m[1][1]);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    hdoj 2586 How far away?(最近公共祖先)
    poj 1330 A-Nearest Common Ancestors
    心形图
    B1928 日期差值
    B1022 D进制的A+B
    B1009 说反话
    hihocoder 1498 签到
    51Nod 1082 与7无关的数
    51Nod 1015 水仙花数
    51Nod 1283 最小周长
  • 原文地址:https://www.cnblogs.com/linkzijun/p/6574675.html
Copyright © 2020-2023  润新知