UVA - 12470 Tribonacci

原创 2016年08月29日 21:11:21

题目:



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

看题目名字就知道是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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

JavaScript趣题:Tribonacci数列

下面,我想介绍一下Fibonacci(斐波那契数列)的大兄弟,Tribonacci数列。 正如它的名字所暗示的那样,它和斐波那契数列方式很相像,但又有不同的地方。 如果我们用[1,1,1]开始这个数列...

Tribonacci数列前n项和的求解问题

Tribonacci数列前n项和的求解问题
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)