要想通这个题目应该很容易,由于斐波纳契数在近100项之后很大,早就超出long long了。而输入最长的序列才40个数字,所以大约保留前50位,前40位是没有误差的!!!其实,想想我们判断double数字相等时fabs(a-b)<1e-10来忽略double数字由于加法带来的误差,道理是一样的,甚至C++默认的还是1e-5。而保险起见,我的方法中保留了100位。当然这个保留50位的数字加法,也只能模拟一遍,因为要计算10^5项。
然而测试样例有50000组,所以我们先要对输入的字符串做一个字典树!虽然我没学过也没听过,后来AC了队友跟我说这个叫字典树,写个博客纪念一下。
YY一下,我弹了近8次,前3次因为没有建字典树超时,后5次竟然是因为第0项也是计入的,斐波那契序列为1,1,2,3,5,8……。而我竟然认为第一个1不算的。擦擦,其实样例都没过,我一直以为过了,然后还找不到思路错哪了。我是有多眼瞎啊!!!今年还有最后一次机会,希望比赛拿点成绩,千万别再坑这里了。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int maxlen=100000; 6 const int maxn=maxlen+1010; 7 char target[60]; 8 int active_id,active_idx; 9 void ccplus(char *&ch,int &cl,char *&sh,int &sl){ 10 if(cl < sl) ch--,cl++, ch[0]='0'; 11 char carry=0; int idx=cl; 12 while(idx--){ 13 ch[idx] += sh[idx]+carry-'0'; 14 if(ch[idx] > '9') ch[idx]-=10, carry=1; 15 else carry=0; 16 } 17 if(carry) ch--,cl++, ch[0]='1'; 18 if(cl > 100) cl--, sl--; 19 ch[cl]='