「Luogu 1349」一般化フィボナッチ数

より良い読書体験

ポータル

Portal1:Luogu

説明

一般化フィボナッチ数は、フォームの列を参照\(= p個の\回数A_ {N-1} + Q \回A_ {N-2} \) の列の数です。この所与の列数の係数\(P \)\(Q \) との最初の2つの列の最も\(A_1 \)\(A_2 \)は、他の2つの整数を与えられている\(N- \)\ (Mの\) の列数見つける\(N- \)という用語は、\(A_N \)で割った\(M \)剰余を。

入力

図6は、整数入力ラインを含みます。続いて\(P \) \(Q \) \(A_1 \) \(A_2 \) \(N- \) \(m個\) \(P \) \(Q \ )\(\)A_1\(\)A_2整数範囲、\(\ N-)\(m個\)整数の長い範囲にわたって。

出力

出力ラインは、整数、すなわち含ま\(A_N \)で割った\(m個\)剰余を。

サンプル入力

1 1 1 1 10 7

サンプル出力

6

ヒント

列の数(\ 10 \)キーである(\ 55 \)で割った、\(7 \)の残数\(6 \)

解決

実質的にマトリックスのフィボナッチ列である\(T = \ {\\開始bmatrix} 1. 1&0.1&\エンド{} \ bmatrix。)

行列の一般化フィボナッチ数列である\(= F. \ Bmatrix {P}を始める。1&&\\ Q 0 \ bmatrix終了{} \)

そして、要件は次のとおりです。

\ [\開始{整列} F_iと&= F_ {I - 1} \時刻T \\\\&= \開始{bmatrix} F_ {I - 1}&F_ {iが - 2} \\ 0 0 \端{bmatrix}回\ \ {bmatrix} F_ {I - 1}開始{bmatrix} 1&1 \\ 1&0 \端{bmatrix} \\\\&=を\始める+ F_ {I - 2}&F_を{ I - 1} \\ 0 0 \端{bmatrix} \\\\&= \開始{bmatrix}のf_i&F_ {I - 1} \\ 0 0 \端{bmatrix} \端{整列} \]

その後、急速に力を解決するために、マトリックスを使用することができます。

コード

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

typedef long long LL;

struct Matrix {
    LL a[2][2];
    inline void clear() {//矩阵清空
        memset(a, 0, sizeof(a));
    }
    inline void init() {//单位矩阵
        memset(a, 0, sizeof(a));
        for (int i = 0; i < 2; i++)
            a[i][i] = 1;
    }
};
LL n, p, q, a1, a2, mod;
Matrix F, a, ans;
inline LL Plus(LL x, LL y) {
    x += y;
    if (x >= mod) x -= mod;
    return x;
}
inline LL power(LL x, LL y) {//快速幂
    LL ret = 0;
    while (y) {
        if (y & 1) ret = (ret + x) % mod;
        x = (x + x) % mod;
        y >>= 1;
    }
    return ret;
}
Matrix operator * (Matrix a, Matrix b) {//矩阵乘法
    Matrix ret;
    ret.clear();
    for (int i = 0; i < 2; i++)
        for (int j = 0; j < 2; j++)
            for (int k = 0; k < 2; k++)
                ret.a[i][j] = Plus(ret.a[i][j] % mod, power(a.a[i][k], b.a[k][j])% mod) % mod;
    return ret;
}
inline Matrix Matrix_Power(Matrix a, LL x) {//矩阵快速幂
    Matrix ret;
    ret.init();
    while (x) {
        if (x & 1) ret = ret * a;
        x >>= 1;
        a = a * a;
    }
    return ret;
}
int main() {
    scanf("%lld%lld%lld%lld%lld%lld", &q, &p, &a1, &a2, &n, &mod);
    F.a[0][0] = a1, F.a[0][1] = a2;
    a.a[0][0] = 0, a.a[1][0] = 1, a.a[0][1] = p; a.a[1][1] = q;
    ans = F * Matrix_Power(a, n - 2);
    printf("%lld\n", ans.a[0][1] % mod);
    return 0;
}

おすすめ

転載: www.cnblogs.com/shenxiaohuang/p/11574548.html