UVA - 12470 Tribonacci

题目:



这个题目,我主要就是被题目名字吸引,所以才把这个水题做了一下。

看题目名字就知道是3阶斐波那契数列的意思,然后看后面那么多输入输出一下就懂了什么意思。

(事实上我真的没有看正文)

既然是3阶齐次线性递归,那用矩阵快速幂一下就出来了。

代码很简单,直接把我的另外一篇博客稍微改改就出来了。

代码:

#include<iostream>
using namespace std;

int n = 3;
int mod = 1000000009;
long long in[3][3] = { 1, 1, 1, 1, 0, 0, 0, 1, 0 };
long long list[3][3], temp[3][3];

void pro(long long l1[][3], long long l2[][3], long long t[][3])		//t=l1*l2
{
	for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)
	{
		t[i][j] = 0;
		for (int k = 0; k < n; k++)t[i][j] = (t[i][j] + l1[i][k] * l2[k][j]) % mod;
	}
}

void f(long long num)		//让list是in的num次方
{
	if (num == 0)
	{
		for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)list[i][j] = (i == j);
		return;
	}
	f(num / 2);
	pro(list, list, temp);
	if (num % 2)pro(temp, in, list);
	else for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)list[i][j] = temp[i][j];
}

int main()
{
	long long k;
	while (cin >> k)
	{
		if (k == 0)break;
		if (k == 1)cout << 0 << endl;
		else if (k == 2)cout << 1 << endl;
		else
		{
			f(k - 3);
			cout << (list[0][0] * 2 + list[0][1]) % mod << endl;
		}
	}
	return 0;
}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nameofcsdn/article/details/52356557
个人分类: (矩阵)快速幂
所属专栏: ACM入门专栏
上一篇POJ - 3233 Matrix Power Series
下一篇CSU 1791 ceremony
想对作者说点什么? 我来说一句

uva最全ac代码

2013年07月04日 4.18MB 下载

100 - The 3n + 1 problem.c

2014年01月26日 936B 下载

UVA10474 Where is the Marble?

2016年04月29日 146KB 下载

没有更多推荐了,返回首页

关闭
关闭