POJ 3070 Fibonacci(矩阵快速幂)

来源:互联网 发布:二炮研究院 软件中心 编辑:程序博客网 时间:2024/05/29 04:38

本题是一道矩阵快速幂的入门题,提示里面已经给出了矩阵的构造,所以直接快速幂求解即可

#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;}
0 0
原创粉丝点击