2017多校第10场 HDU 6172 Array Challenge 猜公式,矩阵幂

Posted Lsxxxxxxxxxxxxx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017多校第10场 HDU 6172 Array Challenge 猜公式,矩阵幂相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6172

题意:如题。

解法:

 

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod = 1e9+7;
struct Matrix{
    LL a[3][3];
    void set1(){
        memset(a, 0, sizeof(a));
    }
    void set2(){
        memset(a, 0, sizeof(a));
        for(int i=0; i<3; i++) a[i][i]=1;
    }
    void set3()
    {
        a[0][0]=4,a[0][1]=17,a[0][2]=-12;
        a[1][0]=1,a[1][1]=0,a[1][2]=0;
        a[2][0]=0,a[2][1]=1,a[2][2]=0;
    }
};
Matrix operator * (const Matrix &a, const Matrix &b){
    Matrix res;
    res.set1();
    for(int i=0; i<3; i++){
        for(int j=0; j<3; j++){
            for(int k=0; k<3; k++){
                res.a[i][j] = (res.a[i][j]%mod+a.a[i][k]*b.a[k][j]%mod + mod)%mod;
            }
        }
    }
    return res;
}
Matrix qsm(Matrix a, LL n){
    Matrix res;
    res.set2();
    while(n){
        if(n&1) res = res*a;
        a = a*a;
        n/=2LL;
    }
    return res;
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        LL n;
        scanf("%lld", &n);
        if(n==2){
            puts("31");
        }
        else if(n==3){
            puts("197");
        }
        else if(n==4){
            puts("1255");
        }
        else{
            Matrix A,B;
            A.set3();
            B = qsm(A, n-4);
            LL ans = (B.a[0][0]*1255%mod+B.a[0][1]*197%mod+B.a[0][2]*31%mod+mod)%mod;
            printf("%lld\\n", ans%mod);
        }
    }
    return 0;
}

 

以上是关于2017多校第10场 HDU 6172 Array Challenge 猜公式,矩阵幂的主要内容,如果未能解决你的问题,请参考以下文章

2017多校第10场 HDU 6180 Schedule 贪心,multiset

2017多校第10场 HDU 6178 Monkeys 贪心,或者DP

2017多校第6场 HDU 6105 Gameia 博弈

2017多校第9场 HDU 6170 Two strings DP

2017多校第4场 HDU 6078 Wavel Sequence DP

2017多校第8场 HDU 6133 Army Formations 线段树合并