给个数字D,我们可以选择1~D中可以被D整除的因子,除以D得到一个新的D,再用新D除以它的因子得到又一个新D,按次操作除到D=1时结束,求除的次数的期望值。
p[D]表示从D除到1的期望次数,D的因子有cnt个(包括1和本身)
则 ,(其中
)每个都+1表示已除以一次因子。
整理得: 。
#include<cstdio>
#include<cmath>
#include<cstring>
const int N=1e5+5;
double p[N];
void init(){
memset(p,0,sizeof(p));
for(int i=2;i<=N;i++){
double sum=0;
int cnt=0;
p[1]=0;
for(int j=1;j*j<=i;j++){
if(i%j==0){
cnt++;
sum+=(p[j]+1); //+1表示除以因子算走一步了
if(j!=i/j){ //与另一个因子不同
cnt++;
sum+=(p[i/j]+1);
}
}
}
p[i]=sum/(cnt-1);
}
}
int main(){
init();
int T,t=1;scanf("%d",&T);
while(T--){
int n;scanf("%d",&n);
printf("Case %d: %lf\n",t++,p[n]);
}
return 0;
}