IPCP 2005 Northern Preliminary for Northeast North-America &&Fibonacci Numbers

给你一个数n,让你求Fibonacci数的第n项的前四项和后四项,没有八项的只输出前四项。

思路:后四项容易求,两种方法,一种构造矩阵,一种求其周期。。。关键是前四项用到了Fibonacci 公式

代码:

#include<iostream> #include<cstdio> #include<string.h> #include<cmath> #define I (1.0+sqrt(5.0))/2 #define M 10000 using namespace std; typedef long long L; typedef struct str { L s[2][2]; }Node; Node a,b,c; inline void init() { a.s[0][0]=0;a.s[0][1]=1; a.s[1][0]=1;a.s[1][1]=1; b.s[0][0]=1;b.s[0][1]=0; b.s[1][0]=0;b.s[1][1]=1; c.s[0][0]=1;c.s[0][1]=1; c.s[1][0]=0;c.s[1][1]=0; } Node ceil(Node p,Node q) { Node aa; memset(aa.s,0,sizeof(aa.s)); for(int i=0;i<2;++i) for(int j=0;j<2;++j) for(int t=0;t<2;++t) aa.s[i][j]=(aa.s[i][j]+p.s[i][t]*q.s[t][j])%M; return aa; } Node doit(int k) { Node p=b,q=a; while(k) { if(1&k) p=ceil(p,q); q=ceil(q,q); k=k>>1; } p=ceil(c,p);//运算不能交换 return p; } int main() { int f[40]={0,1}; for(int i=2;i<40;++i) f[i]=f[i-1]+f[i-2]; init(); int n; while(~scanf("%d",&n)) { if(n<40) { printf("%d\n",f[n]); continue; } int k=n-2; Node bb=doit(k); double ans=-0.5*(log10(5.0))+n*log10(I); ans-=(int)ans; ans=pow(10.0,ans); while(ans<1000) ans*=10.0; printf("%d...",(int)ans); printf("%04d\n",bb.s[0][1]);//不满足四位的前加0 int mm=5; }return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值