您的位置:首页 > 其它

POJ 3070 Fibonacci 用矩阵求费氏数列

2012-03-10 09:51 375 查看
题意:



题解:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: