poj3070 Fibonacci

来源:互联网 发布:淘宝怎么申请介入处理 编辑:程序博客网 时间:2024/06/18 15:24

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

二进制的思想:将N拆为二进制数,譬如13=(1101)2那么 A^13= A^8 * A^4 * A^1。这个在求快速幂模的时候经常用。

#include <stdio.h>typedef struct node{    int m[2][2];}Matrix;Matrix base,answer;void init_Matrix(Matrix* b_matrix, Matrix* i_matrix){    (*b_matrix).m[0][0]=(*b_matrix).m[0][1]=(*b_matrix).m[1][0]=1;    (*b_matrix).m[1][1]=0;    (*i_matrix).m[0][0]=(*i_matrix).m[1][1]=1;/*单位矩阵*/    (*i_matrix).m[0][1]=(*i_matrix).m[1][0]=0;}Matrix Multiplication(Matrix A,Matrix B)//矩阵乘法{     Matrix pro;     int i,j,k;     for(i=0;i<2;i++)     {        for(j=0;j<2;j++)        {            pro.m[i][j]=0;            for(k=0;k<2;k++)            {                pro.m[i][j]+=(A.m[i][k]*B.m[k][j]);                pro.m[i][j]%=10000;            }        }     }     return pro;}int Fast_Exponentiation(int x)//快速幂: base^x{    while(x)    {        if(x&0x1)            answer=Multiplication(answer,base);        base=Multiplication(base,base);        x>>=1;    }    return answer.m[0][1];}int main(){    int n;    while(~scanf("%d",&n)&&n!=-1)    {        init_Matrix(&base,&answer);        printf("%d\n",Fast_Exponentiation(n));    }return 0;}


0 0