您的位置:首页 > 其它

POJ 3070 Fibonacci(快速幂矩阵)

2012-09-19 20:20 330 查看
题目链接

不是很了解,线代的行列式和矩阵乘法,忘的差不多了。。。



这个矩阵的n-1次方的左上角那个数就是菲薄那切数列的第n项。快速幂矩阵,和快速幂模差不多,把数相乘换成矩阵相乘了。

渣代码请无视,改天整理一个模版版本。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define MOD 10000
#define LL __int64
int mat[3][3],p[3][3];
void mulp()
{
int i,j,k;
int temp[3][3];
memset(temp,0,sizeof(temp));
for(i =  1;i <= 2;i ++)
{
for(j = 1;j <= 2;j ++)
{
for(k = 1;k <= 2;k ++)
{
temp[i][j] += (mat[i][k]*p[k][j])%MOD;
}
}
}
for(i = 1;i <= 2;i ++)
{
for(j = 1;j <= 2;j ++)
mat[i][j] = temp[i][j]%MOD;
}
}
void mulm()
{
int i,j,k;
int temp[3][3];
memset(temp,0,sizeof(temp));
for(i =  1;i <= 2;i ++)
{
for(j = 1;j <= 2;j ++)
{
for(k = 1;k <= 2;k ++)
{
temp[i][j] += (p[i][k]*p[k][j])%MOD;
}
}
}
for(i = 1;i <= 2;i ++)
{
for(j = 1;j <= 2;j ++)
p[i][j] = temp[i][j]%MOD;
}
}
void qmod(LL n)
{
while(n)
{
if(n&1)
mulp();
mulm();
n >>= 1;
}
}
int main()
{
LL n;
while(scanf("%I64d",&n)!=EOF)
{
if(n < 0)
break;
p[1][1] = p[1][2] = p[2][1] = 1;
p[2][2] = 0;
mat[1][1] = mat[2][2] = 1;
mat[1][2] = mat[2][1] = 0;
if(n == 0)
{
printf("0\n");
continue;
}
qmod(n-1);
printf("%d\n",mat[1][1]%MOD);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: