`
wss71104307
  • 浏览: 218942 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

1019 Fibonacci II

阅读更多

前段时间忙这考试,快考完了,继续坚持。

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;

}
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics