矩阵求幂中的整数溢出

时间:2012-09-08 04:49:35

标签: c++

我一直在努力生成需要矩阵求幂的几个序列。 我的代码为小案例生成了正确的值。我提供了以下2个不同的矩阵,我已经使用了2个不同的序列。

矩阵1

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

Martrix2

[4 1]
[-4 0]

我之前尝试使用矩阵中的非负值进行取幂,并得到了预期的结果。

为了适应大的结果值,我使用MOD = 1000000007。

据我所知,当矩阵中的一个值被MOD减少而其他值没有时会出现问题,这反过来会导致最终结果错误。负值也会变大,所以我我也不确定如何处理它们,我的最终答案对许多价值观都是否定的。

我会在这个问题上批评任何链接/资源/帮助 这是代码,它生成Fibonacci产品。

#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;
}

0 个答案:

没有答案