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的值即可。
时间: 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]); }
相关文章推荐
- c# out ref
- 【浅墨Unity3D Shader编程】之八 Unity5新版Shader模板源码解析&运动模糊(径向模糊)屏幕特效的实现
- java开发之路书单
- UIWebView详解
- 番茄工作法——效率
- 微信开发 web
- ios证书无效解决办法
- 哈理工1075取石子(简单的博弈问题)
- POJ2676===sudoku===搜索
- 原生方法上传图片
- CSS3用户界面
- jquery点击图片选中特效
- PHP程序员的技术成长规划(转载)
- 阻塞socket和非阻塞socket(二)
- iOS 代理 XX.delegate = self;崩溃问题
- 生物采购平台 架构问题
- apache三种工作模式
- onDraw(canvas)和dispatchDraw(canvas)方法
- onDraw(canvas)和dispatchDraw(canvas)方法
- onDraw(canvas)和dispatchDraw(canvas)方法