poj 3070 Fibonacci

这个题用矩阵相乘法:

f[n-2]     0 1    ----> f[n-1]

f[n-1]     1 1             f[n];

我们只要对矩阵进行相乘就可以了;

View Code
#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<algorithm>

#include<cmath>

#include<queue>

#include<set>

#include<cstring>

#include<vector>

#include<string>

#define LL long long

using namespace std;

LL G[2][2] = { 0 ,1,1,1 };

LL map[2][2]; 

void  Matrix( int t )

{

     if( t == 1 )

     {

        for( int i = 0 ; i < 2 ;i ++ )

           for( int j = 0 ; j < 2 ; j ++ )

                map[i][j] = G[i][j];

        return ;        

     }    

     Matrix( t/2 );

     LL Map[2][2] = {0}; 

     for( int i =  0; i < 2 ; i ++ )

        for( int j = 0 ; j < 2 ; j ++ )

            for( int k = 0 ; k < 2 ; k ++ )

            {

               Map[i][j] += map[i][k]*map[k][j]; 

            }    

     if( t % 2 == 1 )

     {

        memset( map , 0 , sizeof( map ) ); 

        for( int i =  0; i < 2 ; i ++ )

          for( int j = 0 ; j < 2 ; j ++ )

            for( int k = 0 ; k < 2 ; k ++ )

            {

               map[i][j] =( map[i][j] + Map[i][k]*G[k][j])%10000 ;

            }

        return;         

     }

     else 

     {

           for( int i = 0 ; i < 2 ;i ++ )

           for( int j = 0; j < 2 ; j ++ )

              map[i][j] = Map[i][j]%10000;    

     } 

} 

int main(  )

{

    int n;

    while( scanf( "%d",&n ),n!=-1 )

    {

           LL F[2] = { 0 , 1 },sum;

           if( n == 0 ) sum = 0;

        else if( n == 1 ) sum = 1;

        else

        { 

           Matrix( n - 1 ); 

           sum = (F[0]*map[1][0] + F[1]*map[1][1]);

        } 

        printf( "%I64d\n",sum );  

    } 

    //system( "pause" );

    return 0;

}

 

你可能感兴趣的:(fibonacci)