您的位置:首页 > 其它

UVA 12470 - Tribonacci(快速幂矩阵)

2012-09-20 14:00 253 查看
题目链接

开始居然错以为是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: