另斐波那契数列的矩阵为 1 1
1 0
/*定义矩阵 Matrix A;
A.clear();
/*改*/
A.n = A.m = 2;
A.a[0][0] = 1;
A.a[0][1] = 1;
A.a[1][0] = 1;
A.a[1][1] = 0;
接口:Matrix res = Matrix_pow(A, n - 1);
cout<
#include
typedef long long ll;
using namespace std;
/*改*/
const int maxn = 5;
const int maxm = 5;
const int mod = 10000;
struct Matrix
{
int n, m;
ll a[maxn][maxm];
void clear()
{
n = m = 0;
memset(a, 0, sizeof(a));
}
Matrix operator * (const Matrix &b) const
{
Matrix tmp;
tmp.clear();
tmp.n = n;
tmp.m = b.m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
if (!a[i][j]) continue; //稀疏矩阵乘法优化
for (int k = 0; k < b.m; k++)
{
tmp.a[i][k] += a[i][j] * b.a[j][k];
tmp.a[i][k] %= mod;
}
}
return tmp;
}
};
int n;
Matrix Matrix_pow(Matrix A, int k)
{
Matrix res;
res.clear();
res.n = res.m = 2;//改
for (int i = 0; i < 2; i++) //改
res.a[i][i] = 1;
while(k)
{
if (k & 1) res = res * A;
k >>= 1;
A = A * A;
}
return res;
}
int main ()
{
//freopen("text.in","r",stdin);
Matrix A;
A.clear();
/*改*/
A.n = A.m = 2;
A.a[0][0] = 1;
A.a[0][1] = 1;
A.a[1][0] = 1;
A.a[1][1] = 0;
while(1)
{
int n;
scanf("%d", &n);
if(n == -1)
break;
if(n == 0)
{
printf("0\n");
continue;
}
Matrix res = Matrix_pow(A, n - 1);
printf("%lld\n", res.a[0][0]);
}
return 0;
}