前段时间忙这考试,快考完了,继续坚持。
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; }