1732 Fibonacci数列 2
Posted 神犇(shenben)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1732 Fibonacci数列 2相关的知识,希望对你有一定的参考价值。
题目描述 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 点此展开
AC代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define ll long long const ll mod=1000000007; ll a[2][2],b[2][2],c[2][2]; int main(){ ll n; while(scanf("%lld",&n)==1){ if(n==1){puts("1");continue;} if(n==2){puts("1");continue;} if(n==3){puts("2");continue;} n-=3; a[0][0]=1;a[0][1]=1;a[1][0]=1;a[1][1]=0; b[0][0]=1;b[0][1]=1;b[1][0]=1;b[1][1]=0; while(n){ if(n&1){ c[0][0]=(a[0][0]*b[0][0]%mod+a[0][1]*b[1][0]%mod)%mod; c[0][1]=(a[0][0]*b[0][1]%mod+a[0][1]*b[1][1]%mod)%mod; c[1][0]=(a[1][0]*b[0][0]%mod+a[1][1]*b[1][0]%mod)%mod; c[1][1]=(a[1][0]*b[0][1]%mod+a[1][1]*b[1][1]%mod)%mod; memcpy(a,c,sizeof c); } c[0][0]=(b[0][0]*b[0][0]%mod+b[0][1]*b[1][0]%mod)%mod; c[0][1]=(b[0][0]*b[0][1]%mod+b[0][1]*b[1][1]%mod)%mod; c[1][0]=(b[1][0]*b[0][0]%mod+b[1][1]*b[1][0]%mod)%mod; c[1][1]=(b[1][0]*b[0][1]%mod+b[1][1]*b[1][1]%mod)%mod; memcpy(b,c,sizeof c); n>>=1; } printf("%lld\n",(a[0][0]+a[0][1])%mod); } return 0; }
以上是关于1732 Fibonacci数列 2的主要内容,如果未能解决你的问题,请参考以下文章