【HDU】 1316 How Many Fibs?
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1316
请参见我的另一篇博文,本题是在HDU 1715的基础上拓展了。我的做法是将打表结束的Fibonacci数转化成字符串,然后采用字符串比较方式做。
而奇怪的是,这道题在oj上显示是0MS,而1715那个是31MS... 额,我不说话了...
#include <iostream> #include <map> #include <cmath> #include <cstring> #include <string> #include <cstdio> #include <cstdlib> #include <queue> #include <algorithm> #include <ctime> #include <iomanip> #define in freopen("in.txt","r",stdin) #define ou freopen("gou.txt","w",stdout) #define INF_MAX 0x7FFFFFFF #define MARK 1e-5 #define MAXN 1010 using namespace std; int f[MAXN][MAXN], len[MAXN]; char ff[MAXN][MAXN], a[MAXN], b[MAXN]; void Change() { int i, j; for(i=1; i<MAXN; ++i){ for(j=len[i]-1; j>=0; --j) ff[i][len[i]-j-1] = f[i][j]+'0'; ff[i][len[i]] = '\0'; } } void GetFibonacci() { int i, j, k, len1, len2, t; memset(len,0,sizeof(len)); len[1] = 1; len[2] = 1; f[1][0] = 1; f[2][0] = 1; for(i=3; i<MAXN; ++i){ len[i] = len[i-1] > len[i-2] ? len[i-1] : len[i-2]; for(j=0; j<MAXN; ++j) f[i][j] = 0; t = 0; for(j=0; j<len[i]; ++j){ f[i][j] = (f[i-1][j]+f[i-2][j]+t)%10; t = (f[i-1][j]+f[i-2][j]+t)/10; } if(t){ f[i][len[i]] = t; len[i]++; } } Change(); } int main() { int n, i, j, len1, len2, ans; GetFibonacci(); while(scanf("%s %s",a,b)){ len1 = strlen(a); len2 = strlen(b); if(len1==1 && a[0]=='0' && len2 ==1 && b[0]=='0') break; ans = 0; for(i=2; i<MAXN; ++i){ if(len2<len[i] ) break; else if(len[i]==len2 && strcmp(ff[i],b)>0) break; if(len1<len[i]) ans++; else if(len1==len[i] && strcmp(ff[i],a)>=0) ans++; } printf("%d\n",ans); } return 0; }
浙公网安备 33010602011771号