#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
#include<queue>
#define ull unsigned long long
#define ll long long
#define lint long long
using namespace std;
const double eps=1e-12;
const int INF=0x3f3f3f3f;
const int N=1000010;
double dp[N];//記憶化搜索數(shù)組
int p[N];//標(biāo)記是否是素?cái)?shù)
int prime[N];//將素?cái)?shù)從小到大放到prime數(shù)組里面
double dfs(int x)
{
if(dp[x]>=-0.5)
return dp[x];//記憶化
if(x==1)//邊界
return (dp[x]=0.0);
double sum=0.0;
int p=0,g=0;//p表示所有小于等于x的素?cái)?shù)個(gè)數(shù) g表示這些素?cái)?shù)中是x的約數(shù)的個(gè)數(shù)
for(p=0;prime[p]<=x;++p)//枚舉所以小于等于x的素?cái)?shù)
if(x%prime[p]==0)
{
++g;
sum+=dfs(x/prime[p]);
}
return (dp[x]=(sum+p)/g);//這個(gè)式子推導(dǎo)可得
}
int main()
{
//freopen("data.in","r",stdin);
memset(p,-1,sizeof(p));
int ln=0;
for(int i=2;i<N;++i)
{
if(p[i])
{
prime[ln++]=i;
for(int j=i+i;j<N;j+=i)
{
p[j]=0;
}
}
}
for(int i=0;i<N;++i) dp[i]=-1.0;
int T;
scanf("%d",&T);
for(int c=1;c<=T;++c)
{
int n;
scanf("%d",&n);
printf("Case %d: %.10lf\n",c,dfs(n));
}
return 0;
}