#include<bits/stdc++.h>
#define db long double
using namespace std;
const int N=2e5+5;
const db eps=1e-10;
int n,tot;
int pr[N],a[N],w[N];
db m[N],K;
bool vis[N];
void init(){
for(int i=2;i<=182376;i++){
if(!vis[i]){
pr[i]+=i;
for(int j=i+i;j<=182376;j+=i){
pr[j]+=i,vis[j]=1;
}
}
}
}
struct Lichao_segment_tree{
int id[N<<2];
struct Seg{db k,b;}seg[N];
void add(db k,db b){
seg[++tot]={k,b};
}
int cmp(db x,db y){
if(x<y-eps)return 0;
if(x>y+eps)return 1;
return 2;
}
db calc(int x,int i){
return seg[i].k*x+seg[i].b;
}
void upd(int u,int l,int r,int i){
int mid=(l+r)>>1;
if(!id[u])return id[u]=i,void();
if(!cmp(calc(mid,i),calc(mid,id[u])))swap(id[u],i);
if(l==r)return;
int fl1=cmp(calc(l,i),calc(l,id[u])),fl2=cmp(calc(r,i),calc(r,id[u]));
if(!fl1)upd(u<<1,l,mid,i);
if(!fl2)upd(u<<1|1,mid+1,r,i);
}
db qry(int u,int l,int r,int x){
if(!id[u])return 1e18;
db ret=calc(x,id[u]);
if(l==r)return ret;
int mid=(l+r)>>1;
if(x<=mid)ret=min(ret,qry(u<<1,l,mid,x));
else ret=min(ret,qry(u<<1|1,mid+1,r,x));
return ret;
}
}T;
int main(){
scanf("%d%Lf%Lf",&n,&m[1],&K);
init();
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
a[i]=pr[w[i]];
}
db ans=m[1];
T.add(1.0L/m[1],(db)a[1]/m[1]);
T.upd(1,0,N,tot);
for(int i=2;i<=n;i++){
m[i]=1.0L/T.qry(1,0,N,a[i])+K;
T.add(1.0L/m[i],1.0L*a[i]/m[i]);
T.upd(1,0,N,tot);
ans+=m[i];
}
printf("%.12Lf",ans);
return 0;
}