水题 大数fibs数列+二分查找。。。
#include <cstring> #include <cstdio> #define N 500 char s[N][N]; char s2[110],str[110]; void ans(int *a, int *b) { for(int i=0; i<N; ++i) a[i]=b[i]; } void _ans(char *s, int *a) { int k=N-1; int j=0; for(; k>=0; --k) if(a[k]) break; for(int i=k; i>=0; --i) s[j++]=a[i]+'0'; } void solve() { int a[N]; int b[N]; int c[N]; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); memset(s, 0, sizeof(s)); a[0]=1; b[0]=2; s[0][0]='1'; s[1][0]='2'; for(int i=2; i<N; ++i) { int m=0; for(int j=0; j<N; ++j) { c[j]=a[j]+b[j]+m; m=c[j]/10; c[j]=c[j]%10; } _ans(s[i],c); ans(a,b); ans(b,c); } } bool pan(int a, char *str) { int len=strlen(s[a]); int len2=strlen(str); if(len>len2) return false; else if(len<len2) return true; else { if(strcmp(s[a],str)<=0) return true; return false; } } int finds(char *str) { int l=0,r=N-1,mid; while(l<r) { mid=(l+r)/2; if(!strcmp(s[mid],str)) return mid; if(pan(mid,str)) l=mid+1; else r=mid; } return l; } int main() { solve(); while(scanf("%s %s",s2,str)==2) { if(!strcmp("0",s2) && !strcmp("0",str)) return 0; int a=finds(s2); int b=finds(str); // printf("%d %s\n",a, s[a]); // printf("%d %s\n",b,s[b]); if((!strcmp(s[a],s2) && !strcmp(s[b],str)) || (strcmp(s[a],s2) && !strcmp(s[b],str))) a--; printf("%d\n",b-a); } return 0; }