https://vjudge.net/contest/173966#problem/E
题目确实不好说,反正用大数加法+字典树就可以了,哇了N次我就不说什么了,
主要是还说我的大数写错了,然后单独验证了,没毛病,但是貌似我之前的赋值是有问题的,
然后不想写了,过了一天还是又翻出来了。
1 #include<iostream>
2 #include<stdio.h>
3 using namespace std;
4 string fib(string s1,string s2)
5 {
6 if(s1.length()<s2.length())
7 {
8 string temp=s1;
9 s1=s2;
10 s2=temp;
11 }
12 int i,j;
13 if(s2.length()>49)
14 {
15 for(i=49,j=s2.length()+49-s1.length();i>=0;i--,j--)
16 {
17 s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
18 if(s1[i]-'0'>=10)
19 {
20 s1[i]=char((s1[i]-'0')%10+'0');
21 if(i) s1[i-1]++;
22 else s1='1'+s1;
23 }
24 }
25 }
26 else
27 {
28 for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
29 {
30 s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));
31 if(s1[i]-'0'>=10)
32 {
33 s1[i]=char((s1[i]-'0')%10+'0');
34 if(i) s1[i-1]++;
35 else s1='1'+s1;
36 }
37 }
38 }
39 return s1;
40 }
41 string a[100002];
42 int cnt=1;
43 int sum[10000050][11];
44 int num[10000050];
45 void add(string s,int number)
46 {
47 int root=0;
48 for(int i=0;i<s.length()&&i<42;i++)
49 {
50 int xx=s[i]-'0';
51 if(!sum[root][xx])
52 {
53 sum[root][xx]=cnt++;
54 num[sum[root][xx]]=number;
55 }
56 root=sum[root][xx];
57 }
58 }
59 int Find(string s)
60 {
61 int root=0;
62 for(int i=0;i<s.length();i++)
63 {
64 int xx=s[i]-'0';
65 root=sum[root][xx];
66 if(root==0)
67 return 0;
68 }
69 return num[root];
70 }
71 int main()
72 {
73 a[1]="1";
74 a[2]="1";
75 add(a[1],1);
76 add(a[2],2);
77 for(int i=3;i<=100000;i++)
78 {
79 a[i]=fib(a[i-1],a[i-2]);
80 add(a[i],i);
81 }
82 int T;
83 while(cin>>T)
84 {
85 int t=0;
86 string st;
87 while(T--)
88 {
89 t++;
90 cin>>st;
91 int tmp=Find(st);
92 if(tmp){
93 cout<<"Case #"<<t<<": "<<tmp-1<<endl;
94 }else{
95 cout<<"Case #"<<t<<": "<<-1<<endl;
96 }
97 }
98 }
99 return 0;
100 }