首页 > 代码库 > 1732 Fibonacci数列 2
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 点此展开
矩阵乘法 数论
AC代码:
#include<cstdio>#include<cstring>#include<iostream>using namespace std;#define ll long longconst 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。