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;
}

 

posted @ 2012-07-24 22:31  wutaoKeen  阅读(128)  评论(0)    收藏  举报