P1337 fibonacci数列(tyvj)

 

http://www.tyvj.cn/p/1337

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

描述

著名的斐波那契数列
f[n]=1               n=1,2
     f[n-1]+f[n-2]   n>2
现在求第n项,由于f[n]可能很大,你只需要输出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[N][N]; }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]); }

 

 

 

你可能感兴趣的:(P1337 fibonacci数列(tyvj))