#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=1000005;
int p[N],tmp[N],maxn;
double dp[N];
void prime(){
for(int i=2;i<N;i++)
for(int j=i+i;j<N;j+=i)
p[j]=1;
for(int i=2;i<N;i++){
if(!p[i]){
tmp[maxn++]=i;
}
}
}
double dfs(int n){
if(dp[n]!=-1) return dp[n];
dp[n]=0;
if(n==1) return dp[n];
int tot=0,cnt=0;
for(int i=0;i<maxn&&tmp[i]<=n;i++){
tot++;
if(n%tmp[i]==0){
cnt++;
dp[n]+=dfs(n/tmp[i]);
}
}
dp[n]=(dp[n]+tot)/cnt;
return dp[n];
}
//令 dp[ i ] 表示 D = i 的时候的期望, 即从i 转移到1 的次数期望
//dp(n)=(1−cnt/tot)∗dp(n)+∑dp(n/prime)∗(1/tot)
//cnt素数质因子数,tot总素数\
y为x的素数因子,sum[x]表示1到x中有多少个素数,p[x]表示x\
的素数因子个数
//dp[x] = 1+dp[x]*( (sum[x]-p[x])/sum[x] )+∑ (dp[x/y] / sum[x] )\
========>>>>dp[x]=(tot+∑ (dp[x/y])/cnt
int main()
{
int T,n,cas=0;
//memset(dp,-1,sizeof(dp));
for(int i=0;i<N;i++) dp[i]=-1;//不可用上面那句初始化
//cout<<dp[9]<<endl;
cin>>T;
prime();
//for(int i=0;i<50;i++)cout<<i<<' '<<p[i]<<endl;
while(T--){
scanf("%d",&n);
printf("Case %d: %.10lf\n",++cas,dfs(n));
}
return 0;
}