我一直在努力生成需要矩阵求幂的几个序列。 我的代码为小案例生成了正确的值。我提供了以下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;
}