0

私は、行列の累乗が必要ないくつかのシーケンスを生成しようとしています。私のコードは、小さなケースに対して正しい値を生成します.2つの異なるシーケンスに使用している2つの異なるマトリックスを以下に示しました.

マトリックス1

[2  1 -2 -1]
[1  0  0  0]
[0  1  0  0]
[0  0  1  0]  

マトリックス2

[4 1]
[-4 0]

以前、行列に負でない値を使用して累乗を試みたことがあり、目的の結果が得られていました。

結果の大きな値に対応するために、MOD=1000000007 を使用しています。

私が理解している限り、マトリックス内の値の1つがMODによって減少し、他の値が減少しない場合に問題が発生し、最終結果が間違っています.また、負の値も大きくなっているので、私もそうではありませんそれらをどうするかを確認してください。私の最終的な答えは、多くの値に対して否定的です。

この問題に関するリンク/リソース/ヘルプを高く評価します。
コードは次のとおりです。フィボナッチ積を生成します。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <cmath>
#include <list>
#include <map>
#include<conio.h>
#include <cassert>
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
#define rep(i,n) for(int i=0;i<n;i++)
#define fill(x,y) memset(x,y,sizeof(x))
#define Size(x) (int(x.size()))
#define FOR(k,a,b) for(typeof(a) k=(a); k < (b); ++k)
typedef long long ll;
using namespace std;
#define dim 4


struct matrix
{
    int a[dim][dim];
};

#define MOD 1000000007

matrix mul(matrix x, matrix y)
{
    matrix res;
    FOR(a, 0, dim) FOR(b, 0, dim) res.a[a][b] = 0;
    FOR(a, 0, dim) FOR(b, 0, dim) FOR(c, 0, dim)
    {
        res.a[a][c] += (x.a[a][b] * ll(y.a[b][c])) % MOD;
        res.a[a][c] %= MOD;
    }
    return res;
}

matrix power(matrix m, int n)
{
    if (n == 1) return m;
    matrix u = mul(m, m);
    u = power(u, n / 2);
    if (n & 1) u = mul(u, m);
    return u;
}

matrix M, C, D, RP, A;

int main()
{
    FOR(a, 0, dim) FOR(b, 0, dim) M.a[a][b] = 0;
    M.a[0][0] = 2;
    M.a[1][0] = 1;
    M.a[2][0] = -2;
    M.a[3][0] = -1;
    M.a[0][1] = M.a[1][2] = M.a[2][3] = 1;
    C.a[0][0] = 96;
    C.a[0][1] = 44;
    C.a[0][2] = 18;
    C.a[0][3] = 5;
    int nt;
    scanf("%d", & nt);
    while (nt--)
    {
        int n;
        scanf("%d", & n);
        if (n <= 5)
        {
            if (n == 5) printf("96\n");
            if (n == 4) printf("44\n");
            if (n == 2) printf("5\n");
            if (n == 3) printf("18\n");
            if (n == 1) printf("2\n");
            continue;
        }
        if (n > 5)
        {
            int rs = n - 5;
            RP = power(M, rs);
            A = mul(C, RP);
            printf("%d\n", A.a[0][0]);
        }
    }
    getch();
    return 0;
}
4

0 に答える 0