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


浙公网安备 33010602011771号