poj 3070 Fibonacci (矩阵快速幂)

来源:互联网 发布:阿里云ecs ssh 编辑:程序博客网 时间:2024/06/05 04:13

http://poj.org/problem?id=3070

.

矩阵快速幂

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <cstdlib>#include <limits>#include <queue>#include <stack>#include <vector>#include <map>using namespace std;#define N 60#define INF 0x3f3f3f3f#define PI acos (-1.0)#define EPS 1e-8#define met(a, b) memset (a, b, sizeof (a))typedef long long LL;struct node{    int a[N][N];}s, e;node quick_pow (node p, int n);node mul (node p, node q);int main (){    int n;    s.a[0][0] = 1;    s.a[0][1] = 1;    s.a[1][0] = 1;    s.a[1][1] = 0;    while (scanf ("%d", &n), n!=-1)    {        e = quick_pow (s, n);        printf ("%d\n", e.a[0][1]);    }    return 0;}node quick_pow (node p, int n){    node tem;    for (int i=0; i<2; i++)        for (int j=0; j<2; j++)        tem.a[i][j] = (i == j);    while (n)    {        if (n & 1)            tem = mul (tem, p);        n /= 2;        p = mul (p, p);    }    return tem;}node mul (node p, node q){    node tem;    for (int i=0; i<2; i++)    {        for (int j=0; j<2; j++)        {            tem.a[i][j] = 0;            for (int k=0; k<2; k++)                tem.a[i][j] = (tem.a[i][j] + p.a[i][k] * q.a[k][j]) % 10000;        }    }    return tem;}


1 0