UVA 12470 - Tribonacci(快速幂矩阵)
2012-09-20 14:00
253 查看
题目链接
开始居然错以为是Fib,其实是Trib,对矩阵加深了一下认识,F(n) = F(n-1)+F(n-2)+F(n-3) 初始矩阵变为3阶了。幂模依旧很搓,搜很多个版本,基本上都是运算符重载的,还有调用数组名的,当然也有直接运算的,凑合着用吧。
开始居然错以为是Fib,其实是Trib,对矩阵加深了一下认识,F(n) = F(n-1)+F(n-2)+F(n-3) 初始矩阵变为3阶了。幂模依旧很搓,搜很多个版本,基本上都是运算符重载的,还有调用数组名的,当然也有直接运算的,凑合着用吧。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> using namespace std; #define MOD 1000000009 #define LL long long LL p[3][3],mat[3][3]; LL qmod(LL n) { int i,j,k; LL c[3][3]; while(n) { if(n&1) { memset(c,0,sizeof(c)); for(i = 0; i <= 2; i ++) for(j = 0; j <= 2; j ++) for(k = 0; k <= 2; k ++) { c[i][j] += mat[i][k]*p[k][j]; c[i][j] %= MOD; } memcpy(mat,c,sizeof(mat)); } memset(c,0,sizeof(c)); for(i = 0; i <= 2; i ++) for(j = 0; j <= 2; j ++) for(k = 0; k <= 2; k ++) { c[i][j] += p[i][k]*p[k][j]; c[i][j] %= MOD; } memcpy(p,c,sizeof(p)); n >>= 1; } return (2*mat[0][0]+mat[0][1])%MOD; } int main() { int i,j; LL n,ans; while(scanf("%lld",&n)!=EOF) { if(n == 0) break; memset(p,0,sizeof(p)); p[0][1] = p[0][2] = p[0][0] = 1; p[1][0] = 1; p[2][1] = 1; for(i = 0; i <= 2; i ++) for(j = 0; j <= 2; j ++) if(i == j) mat[i][j] = 1; else mat[i][j] = 0; if(n <= 3) { printf("%lld\n",n-1); continue; } printf("%lld\n",qmod(n-3)); } return 0; }
相关文章推荐
- UVA - 12470 Tribonacci 矩阵快速幂
- uva 12470(矩阵快速幂)
- UVA 10870 Recurrences(矩阵快速幂)
- uva 10655 - Contemplation! Algebra(矩阵快速幂)
- UVA - 10870 Recurrences 矩阵快速幂
- UVA 10870 Recurrences 矩阵快速幂
- Power of Matrix UVA - 11149 (矩阵快速幂)
- 矩阵快速幂 UVA 10870 Recurrences
- 【矩阵快速幂】UVA 10698 G - Yet another Number Sequence
- uva 10655 Contemplation! Algebra(矩阵快速幂)
- UVA 10689 Yet another Number Sequence(矩阵快速幂求Fib数列)
- UVA 10870 Recurrences 矩阵快速幂
- UVA 10689 Yet another Number Sequence 矩阵快速幂 水呀水
- UVA1386 快速矩阵幂 O(n²logk)
- uva10870 Recurrences矩阵快速幂
- 【矩阵快速幂】Recurrences UVA - 10870
- uva10689矩阵快速幂
- UVA 11551 Experienced Endeavour(矩阵快速幂)
- UVA 10870 (矩阵快速幂)
- UVA 10655 Contemplation! Algebra (矩阵快速幂)