隐藏页面特效

1732 Fibonacci数列 2

1732 Fibonacci数列 2

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description

在“1250 Fibonacci数列”中,我们求出了第n个Fibonacci数列的值。但是1250中,n<=109。现在,你的任务仍然是求出第n个Fibonacci数列的值,但是注意:n为整数,且1 <= n <= 100000000000000

输入描述 Input Description

输入有多组数据,每组数据占一行,为一个整数n(1 <= n <= 100000000000000)

输出描述 Output Description

输出若干行。每行输出第(对应的输入的)n个Fibonacci数(考虑到数会很大,mod 1000000007)

样例输入 Sample Input

3
4
5

 

样例输出 Sample Output

2
3
5

 

数据范围及提示 Data Size & Hint

1 <= n <= 100000000000000

分类标签 Tags 点此展开 

 
2017-03-24
#include<cstdio> #include<cstring> #define m(s) memset(s,0,sizeof s) using namespace std; typedef long long ll; const ll mod=1e9+7;ll n; struct matrix{ll s[2][2];}A,F; matrix operator *(const matrix &a,const matrix &b){ matrix c; for(int i=0;i<2;i++){ for(int j=0;j<2;j++){ c.s[i][j]=0; for(int k=0;k<2;k++){ c.s[i][j]+=a.s[i][k]*b.s[k][j]; c.s[i][j]%=mod; } } } return c; } //Fi=A^i*F0; matrix fpow(matrix a,ll p){ matrix ans; for(int i=0;i<2;i++)for(int j=0;j<2;j++) ans.s[i][j]=(i==j); for(;p;p>>=1,a=a*a) if(p&1) ans=ans*a; return ans; } int main(){ while(scanf("%lld",&n)==1){ F.s[0][0]=1;F.s[0][1]=F.s[1][0]=F.s[1][1]=0; A.s[0][0]=A.s[0][1]=A.s[1][0]=1;A.s[1][1]=0; if(n>1) F=fpow(A,n-1)*F; printf("%lld\n",F.s[0][0]); } return 0; }

 

2016-09-17

AC代码:
#include<cstdio> #include<cstring> #define ll long long #ifdef unix #define LL "%lld" #else #define LL "%I64d" #endif using namespace std; const ll mod=1e9+7; struct node{ ll a[2][2]; }ans,ss; ll n; inline node mul(node &a,node &b){ node c; for(int i=0;i<2;i++){ for(int j=0;j<2;j++){ c.a[i][j]=0; for(int k=0;k<2;k++){ c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod; } } } return c; } void fpow(ll p){ for(;p;p>>=1,ss=mul(ss,ss)) if(p&1) ans=mul(ans,ss); } int main(){ while(scanf(LL,&n)==1){ if(n==1){puts("1");continue;} if(n==2){puts("1");continue;} if(n==3){puts("2");continue;} ans.a[0][0]=ans.a[1][0]=1;ans.a[0][1]=ans.a[1][1]=0; ss.a[0][0]=ss.a[1][0]=ss.a[0][1]=1;ss.a[1][1]=0; n--; fpow(n); printf(LL,ans.a[0][0]);putchar('\n'); } return 0; }

 


__EOF__

本文作者shenben
本文链接https://www.cnblogs.com/shenben/p/5879177.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   神犇(shenben)  阅读(264)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示