POJ 3070 Fibonacci 用矩阵求费氏数列

题意:


题解:

#include <cstdio>
#define SIZE (1<<10)
#define MAX_SIZE 32
using namespace std;

class CMatrix
{
     public:
         int element[MAX_SIZE][MAX_SIZE];
         void setSize(int);
         void setModulo(int);
         CMatrix operator* (CMatrix);
         CMatrix power(__int64);
     private:
         int size;
         int modulo;
};

void CMatrix::setSize(int a)
{
     for (int i=0; i<a; i++)
         for (int j=0; j<a; j++)
             element[i][j]=0;
     size = a;
}

void CMatrix::setModulo(int a)
{
     modulo = a;
}

CMatrix CMatrix::operator* (CMatrix param)
{
     CMatrix product;
     product.setSize(size);
     product.setModulo(modulo);
     for (int i=0; i<size; i++)
         for (int j=0; j<size; j++)
             for (int k=0; k<size; k++)
             {
                 product.element[i][j]+=element[i][k]*param.element[k][j];
                 product.element[i][j]%=modulo;
             }

     return product;
}

CMatrix CMatrix::power( __int64 exp )
{
     CMatrix tmp = (*this) * (*this);
     if ( exp == 1 ) return *this;
     else if (exp & 1) return tmp.power(exp/2) * (*this);
     else return tmp.power( exp / 2 );
}

int main()
{
    __int64 n;
    while ( scanf("%I64d",&n) && n != -1 )
    {
        if ( n == 0 ) { printf("0\n"); continue; }
        CMatrix obj, tmp;
        obj.setSize ( 2 );
        obj.setModulo ( 10000 );
        obj.element[0][0] = 1;
        obj.element[0][1] = 1;
        obj.element[1][0] = 1;
        obj.element[1][1] = 0;
        tmp = obj.power(n);
        printf("%d\n",tmp.element[0][1]);
    }
    return 0;
}


你可能感兴趣的:(POJ 3070 Fibonacci 用矩阵求费氏数列)