我一直在尝试产生几个需要矩阵求幂的序列。我的代码为小案例产生了正确的值。我在下面提供了 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。
据我所知,当矩阵中的一个值被 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;
}