#include <stdio.h>
#include <string.h>
#include <string>
using namespace std;
#define MU 10
#define WLEN 100
#define M 100000
struct node{
int id;
node *child[MU];
node()
{
id = -1;
memset(child,NULL,sizeof(child));
}
};
char fnMap[3][WLEN] = {"1","1"};
void clear(node *root)
{
for(int i=0; i<MU; i++)
{
if(root->child[i] != NULL)
clear(root->child[i]);
}
delete root;
}
void insert(node *root, char *str, int addId)
{
node *p = root;
int len = strlen(str);
for(int i=0; i<len && i<40; i++)
{
int k = str[i] - '0';
if(p->child[k] == NULL)
{
p->child[k] = new node;
}
p = p->child[k];
if(p->id < 0)
{
p->id = addId;
}
}
}
int find(node *root, char *str)
{
node *p = root;
int len = strlen(str);
for(int i=0; i<len; i++)
{
int k = str[i] - '0';
if(p->child[k] == NULL)
{
return -1;
}
p = p->child[k];
}
return p->id;
}
void add(char *aStr, char *bStr, char *cStr)//aStr + bStr = cStr
{
int ai = strlen(aStr)-1,bi = strlen(bStr)-1,ci = 0;
int all,over = 0;
for(; ai>=0 || bi>=0; ai--,bi--)
{
all = (ai>=0 ? aStr[ai] : '0') + (bi>=0 ? bStr[bi] : '0') + over - 2 * '0';
cStr[ci++] = all % 10 + '0';
over = all / 10;
}
if(over > 0) cStr[ci++] = over + '0';
cStr[ci] = '\0';
strrev(cStr);
}
void init(node *root)
{
//fnMap[0] = "1",fnMap[1] = "1";
insert(root,fnMap[0],0);
insert(root,fnMap[1],1);
for(int i=2; i<M; i++)
{
int aLen = strlen(fnMap[0]);
int bLen = strlen(fnMap[1]);
if(bLen > 60)
{
fnMap[0][aLen-1] = fnMap[1][bLen-1] = '\0';
}
add(fnMap[0],fnMap[1],fnMap[2]);
insert(root,fnMap[2],i);
memcpy(fnMap[0],fnMap[1],sizeof(fnMap[0]));
memcpy(fnMap[1],fnMap[2],sizeof(fnMap[1]));
}
}
int main(int argc, char* argv[])
{
#ifdef __MYLOCAL
freopen("in.txt","r",stdin);
#endif
int t;
char findStr[WLEN];
node *root = new node;
init(root);
scanf("%d",&t);
for(int i=1; i<=t; i++)
{
scanf("%s",findStr);
printf("Case #%d: %d\n",i,find(root,findStr));
}
clear(root);
return 0;
}