问题本身比较简单,写个高精加就行。提交忘记删文件操作,却显示超时,郁闷。
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 500
#define M 100
int fib[N+5][M+5],len[N+5],sum;
int a[M+5],b[M+5],la,lb;
char s[M+5];
void add(int n)
{
for (int i=0;i<len[n-1];i++){
fib[n][i]+=fib[n-1][i]+fib[n-2][i];
if (fib[n][i]>9) {
fib[n][i+1]++;
fib[n][i]%=10;
}
}
len[n]=len[n-1];
if (fib[n][len[n]]) len[n]++;
}
void init(int a[])
{
scanf("%s",s);
int j=strlen(s);
for (int i=j-1;i>=0;i--)
a[j-i-1]=s[i]-'0';
}
bool read()
{
//memset(a,0,sizeof(a));
// memset(b,0,sizeof(b));
init(a);
la=strlen(s);
init(b);
lb=strlen(s);
if (la+lb==2 && a[0]+b[0]==0)
return false;
return true;
}
inline bool minc(int c[],int lc,int a[],int la,int flag)
{
if (lc<la) return true;
if (lc>la) return false;
int i=lc-1;
for ( ;i>=0;i--)
if (c[i]<a[i]) return true;
else if (c[i]>a[i]) return false;
if (i==-1)
return (flag==0? false:true);
}
void judge()
{
int p=1,q=sum;
while (p<q){
int mid=(p+q)/2;
if (minc(fib[mid],len[mid],a,la,0)) p=mid+1;
else q=mid;
}
q=sum;
int i=p;
while (p<q){
int mid=(p+q)/2;
if (minc(fib[mid],len[mid],b,lb,1)) p=mid+1;
else q=mid;
}
printf("%d\n",q-i);
}
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
fib[1][0]=1;len[1]=1;
fib[2][0]=2;len[2]=1;
sum=3;
add(3);
while (len[sum]<=M){
sum++;
add(sum);
}
while (read()){
judge();
}
return 0;
}