您的位置:首页 > 其它

POJ 3070 Fibonacci(矩阵快速幂)

2017-05-03 10:42 190 查看
本题是一道矩阵快速幂的入门题,提示里面已经给出了矩阵的构造,所以直接快速幂求解即可

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <stack>
#include <set>
#include <map>
using namespace std;
const int MAXN = 2;
const int mod = 10000;

struct  Matrix
{
__int64 a[MAXN][MAXN];
int r;//行数
int c;//列数
};

void init(Matrix &mat, __int64 n)
{
for (int i = 0;i < mat.r;i++)
{
for (int j = 0;j < mat.c;j++)
{
mat.a[i][j] = n;
}
}
}

Matrix mul(Matrix mat1, Matrix mat2)
{
Matrix res;
res.c = mat2.c;
res.r = mat1.r;
init(res, 0);
for (int i = 0;i < mat1.r;i++)
{
for (int j = 0;j < mat2.c;j++)
{
for (int k = 0;k < mat1.c;k++)
{
res.a[i][j] += mat1.a[i][k] * mat2.a[k][j];
res.a[i][j] %= mod;
}
}
}
return res;
}

__int64 fmp(__int64 n)
{
Matrix ans;
ans.c = 2;
ans.r = 2;
ans.a[0][0] = ans.a[0][1] = ans.a[1][0] = 1;
ans.a[1][1] = 0;
Matrix base = ans;
while (n)
{
if (n & 1) ans = mul(ans, base);
base = mul(base, base);
n >>= 1;
}
return ans.a[1][1];
}

int main()
{
__int64 n;
while (cin >> n&&n!=-1)
{
cout << fmp(n) << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息