HDU6030 Happy Necklace(推导+矩阵快速幂)

Posted solvit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU6030 Happy Necklace(推导+矩阵快速幂)相关的知识,希望对你有一定的参考价值。

HDU6030 Happy Necklace

推导或者可以找规律有公式:\(f[n] = f[n-1] + f[n-3]\)

构造矩阵乘法:
\[ \beginpmatrix f_i \\ f_i-1 \\ f_i-2 \endpmatrix = \beginpmatrix 1 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \endpmatrix\beginpmatrix f_i-1 \\ f_i-2 \\ f_i-3 \endpmatrix \]

#include<bits/stdc++.h>

using namespace std;

const int mod = 1e9 + 7;
int t;
long long n;
struct Matrix
    long long a[5][5];
;

Matrix mul(Matrix M1, Matrix M2)

    Matrix ret;
    memset(ret.a, 0, sizeof(ret.a));
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            for(int k = 0; k < 3; k++)
                ret.a[i][j] = (M1.a[i][k] * M2.a[k][j] + ret.a[i][j]) % mod;
            
        
    
    return ret;

void matrix_pow(long long x)

    Matrix ret;
    memset(ret.a, 0, sizeof(ret.a));
    for(int i = 0; i < 3; i++) ret.a[i][i] = 1;
    Matrix tmp;
    memset(tmp.a, 0, sizeof(tmp.a));
    tmp.a[0][0] = tmp.a[0][2] = tmp.a[1][0] = tmp.a[2][1] = 1;
    while(x)
        if(x & 1LL) ret = mul(ret, tmp);
        tmp = mul(tmp, tmp);
        x >>= 1LL;
    
    long long ans = (ret.a[0][0] * 4 + ret.a[0][2] * 2 + ret.a[0][1] * 3) % mod;
    cout << ans << endl;

int main()

    for(scanf("%d", &t); t--; )
        scanf("%lld", &n);
        if(n == 1) puts("2"); continue;
        else if(n == 2) puts("3"); continue;
        else if(n == 3) puts("4"); continue;
        else
            matrix_pow(n - 3);
        
    
    return 0;

以上是关于HDU6030 Happy Necklace(推导+矩阵快速幂)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 6030 Happy Necklace

HDU 6030 Happy Necklace

HDU - 6030 矩阵快速幂 +多组输入快速幂板子

Happy Necklace (矩阵快速幂 + 递推 + 取模)

2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)

hdu 6030