POJ 3070 Fibonacci(矩阵快速幂)

来源:互联网 发布:网络实体小说排行榜 编辑:程序博客网 时间:2024/05/14 13:32

题目地址:http://poj.org/problem?id=3070

思路:矩阵快速幂和快速幂的思想差不多,快速幂详解地址:http://blog.csdn.net/qq_25605637/article/details/47357119,按照下面2张图来就行


AC代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cstring>#include <climits>#include <cmath>#include <cctype>const int inf = 0x3f3f3f3f;//1061109567typedef long long ll;const int maxn = 40000;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;struct node{    int a[2][2];    void init()    {        a[0][0] = a[0][1] = a[1][0] = 1;        a[1][1] = 0;    }};node matrixmul(node a,node b){    node c;    for(int i=0; i<2; i++)    {        for(int j=0; j<2; j++)        {            c.a[i][j] = 0;            for(int k=0; k<2; k++)            {                c.a[i][j] += a.a[i][k] * b.a[k][j];            }            c.a[i][j] %= 10000;        }    }    return c;}node quickmod(node s,int k){    node ans;    ans.init();    while(k)    {        if(k & 1)            ans = matrixmul(ans,s);        k = k >> 1;        s = matrixmul(s,s);    }    return ans;}int main(){    int n;    while(scanf("%d",&n))    {        if(n == -1)            break;        if(n == 0)        {            printf("0\n");            continue;        }        node s;        s.init();        s = quickmod(s,n-1);        printf("%d\n",s.a[0][1]%10000);    }    return 0;}


大神地址:http://www.cnblogs.com/ACShiryu/archive/2011/08/09/poj3070.html

0 0