您的位置:首页 > 其它

P1337 fibonacci数列(tyvj)

2016-02-19 10:55 155 查看
http://www.tyvj.cn/p/1337

时间: 1000ms / 空间: 131072KiB / Java类名: Main

描述

著名的斐波那契数列
f
=1 n=1,2
f[n-1]+f[n-2] n>2
现在求第n项,由于f
可能很大,你只需要输出mod 32768的值即可。

输入格式

仅有一行,为n,1<=n<=maxlongint

输出格式

仅有一个数字,即答案

测试样例1

输入

3

输出

2


备注

各个测试点1s

/*
根据分析可以得到ans{f(n-1),f(n)}*k{0,1}=ans{f(n),f(n+1)}
{1,1}
那么由ans{f(1),f(2)}到ans{f(n-1),f(n)},需乘以n-1个k矩阵,这是可以应用快速幂求的
*/

#include<cstdio>
#include<cstring>
#define m 32768
#define N 2
using namespace std;

struct mat
{
int num

;
}k,ans;
int n;

mat work(mat a,mat b)//矩阵乘法
{
mat temp;
memset(temp.num,0,sizeof(temp.num));
for (int i=0;i<N;i++)
for (int j=0;j<N;j++)
{
for (int h=0;h<N;h++)
temp.num[i][j]+=a.num[i][h]*b.num[j][h];
temp.num[i][j]%=m;
}
return temp;
}

void power()//快速幂
{
while (n!=0)
{
if (n%2==1) ans=work(ans,k);
k=work(k,k);
n/=2;
}
}

int main()
{
scanf("%d",&n);
n=n-2;
k.num[0][0]=0;
k.num[0][1]=k.num[1][0]=k.num[1][1]=1;
ans.num[0][0]=ans.num[0][1]=1;
ans.num[1][0]=ans.num[1][1]=0;
power();
printf("%d",ans.num[0][1]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: