UVA - 12470 Tribonacci

来源:互联网 发布:淘宝活动预热 编辑:程序博客网 时间:2024/06/05 15:06

题目:



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

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

0 0
原创粉丝点击