#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn=1e6;
const int N=10;//26个小写字母
struct node
{
//int flag;//标记以这个字母结尾为一个单词
int count;//标记以这个字母结尾为一个前缀
struct node *pNext[N];//26枚字符指针
} tree[maxn*N]; //大小通常设为 单词个数*单词长度
int t;//表明现在用到了那个节点
struct node *create ()
{
//需要新开一个字符节点,就是有abc这样,插入abd,则d需要新开节点
struct node *p=&tree[t++];
//p->flag=0; //初始值为0,不是整个单词
p->count=1; //前缀是必须的,本身就是一个了
for (int i=0; i<N; i++)
{
p->pNext[i]=NULL;//初始化指针
}
return p;
}
void insert (struct node **T,char str[],int cnt)
{
struct node *p = *T;
if (p==NULL)
{
p=*T=create();
}
// int lenstr = strlen
for (int i=1; str[i] && i <= 42; ++i)
{
int id = str[i]-'0';
if (!p->pNext[id])
{
p->pNext[id]=create();
p->pNext[id]->count = cnt;
}
p = p->pNext[id];
}
if (!p->count) p->count = cnt;
}
int find (struct node *T,char str[])
{
if (T==NULL) return -1;
struct node *p = T;
for (int i=1; str[i]; ++i)
{
int id = str[i]-'0';
if (!p->pNext[id]) return -1;
p = p->pNext[id];
}
return p->count;
}
int b[300]= {0}; //maxn关键,栈分配,系统帮你释放,要时间,不乱开
void bigadd (char str1[],char str2[],char str3[])
{
int len1=strlen(str1+1);
int len2=strlen(str2+1);
//int b[300]= {0}; //maxn关键,栈分配,系统帮你释放,要时间,不乱开
memset(b,0,sizeof (b));
int i=len1;
int j=len2;
int h=1;
while (i>=1&&j>=1)
{
b[h++]=str1[i--]-'0'+str2[j--]-'0';
}
while (i>=1)
{
b[h++]=str1[i--]-'0';
}
while (j>=1)
{
b[h++]=str2[j--]-'0';
}
for (int i=1; i<h; i++)
{
if (b[i]>=10)
{
b[i+1]++;
b[i]-=10;
}
}
if (!b[h])
{
h--;
}
int t=h;
for (int i=1; i<=h; i++)
{
str3[t--]=b[i]+'0';
}
str3[h+1]='\0'; //一定要手动结束
return ;
}
struct node *T = NULL;
char str1[1000],str2[1000],ans[1000];
void init ()
{
str1[1]='1';
str1[2]='\0';
insert(&T,str1,1);
str2[1]='1';
str2[2]='\0';
insert(&T,str2,2);
int lenstr1=1,lenstr2=1;
int dd=60;
for (int i=2; i<100000; ++i)
{
lenstr1 = strlen(str1+1);
lenstr2 = strlen(str2+1);
// if (lenstr1>=dd) str1[lenstr1]='\0';
// if (lenstr2>=dd) str2[lenstr2]='\0'; /gg的
if (lenstr2 > dd)
{
str1[lenstr1] = str2[lenstr2]='\0';//砍项
//str1[dd+1] = str2[dd+1] = '\0';
//考虑下为什么不行,因为一直都是60项了
}
// printf ("%s\n%s\n",str1+1,str2+1);
// lenstr1 = strlen(str1+1);
// lenstr2 = strlen(str2+1);
// printf ("%d %d\n",lenstr1,lenstr2);
bigadd(str1,str2,ans);
insert(&T,ans,i+1);
strcpy(str1+1,str2+1);
strcpy(str2+1,ans+1);
//
// printf ("\n");
// printf ("%s [%d]\n",ans+1,i);
// printf ("\n");
}
return ;
}
int gg;
void work ()
{
scanf("%s",str1+1);
int t=find(T,str1);
if (t!=-1) --t;
printf ("Case #%d: %d\n",++gg,t);
return ;
}
int main()
{
#ifdef local
freopen("data.txt","r",stdin);
#endif
init();
int t;
scanf("%d",&t);
while (t--) work();
return 0;
}