前段时间忙这考试,快考完了,继续坚持。
http://acm.nit.net.cn/showproblem.jsp?pid=1019
Fib问题,矩阵解法。注意数据范围
#include <stdio.h>
#define NTYPE long long
#define MTYPE int
const int A[2][2] = {{1, 1},
{1, 0}};
int main()
{
MTYPE m;
NTYPE n;
while(scanf("%lld %d", &n, &m) != EOF)
{
printf("%d\n", Fib(n, m));
}
return 0;
}
void A_power(int result[][2], NTYPE n, MTYPE m)
{
int temp[2][2]={{1, 1},
{1, 0}};
int ttemp[2][2];
int result_temp[2][2]={{1, 1},
{1, 0}};
while(n)
{
if(n & 1)
{
result_temp[0][0] = result[0][0] * temp [0][0] + result[0][1] * temp [1][0];
result_temp[0][1] = result[0][0] * temp [0][1] + result[0][1] * temp [1][1];
result_temp[1][0] = result[1][0] * temp [0][0] + result[1][1] * temp [1][0];
result_temp[1][1] = result[1][0] * temp [0][1] + result[1][1] * temp [1][1];
result[0][0] = result_temp[0][0]%m;
result[0][1] = result_temp[0][1]%m;
result[1][0] = result_temp[1][0]%m;
result[1][1] = result_temp[1][1]%m;
}
ttemp[0][0] = temp[0][0] * temp [0][0] + temp [0][1] * temp [1][0];
ttemp[0][1] = temp[0][0] * temp [0][1] + temp [0][1] * temp [1][1];
ttemp[1][0] = temp[1][0] * temp [0][0] + temp [1][1] * temp [1][0];
ttemp[1][1] = temp[1][0] * temp [0][1] + temp [1][1] * temp [1][1];
temp[0][0] = ttemp[0][0]%m;
temp[0][1] = ttemp[0][1]%m;
temp[1][0] = ttemp[1][0]%m;
temp[1][1] = ttemp[1][1]%m;
n >>= 1;
}
}
int Fib(NTYPE n, MTYPE m)
{
int result[2][2]={{1, 1},
{1, 0}};
if( n >= 2)
{
A_power(result, n-2, m);
}
return result[0][0] % m;
}
本文介绍了一种使用矩阵快速幂的方法来高效计算Fib数列中的第n项,并考虑了取模运算以应对大数据范围的问题。通过递归分解的方式减少计算复杂度。
178

被折叠的 条评论
为什么被折叠?



