LightOJ 1038 Race to 1 Again 概率DP
Race to 1 Again LightOJ - 1038
对于一个整数 ,每次从他的因数中选一个 ,然后令 ,直到 为止,问从 到 执行这样操作的期望次数。
用 表示整数 变为 的期望次数, 表示因子的总个数, 表示第 个因子,第 个因子 ,第 个因子 ,则:
代码如下:
#include<iostream>
#include<cstdio>
//#define WINE
#define MAXN 100010
using namespace std;
double d[MAXN];
int n,j,T,iCase;
int main(){
#ifdef WINE
freopen("data.in","r",stdin);
#endif
d[0]=d[1]=0;
for(int i=2;i<MAXN;i++){
n=0;
for(j=2;j*j<i;j++){
if(i%j==0){
n+=2;
d[i]+=d[j];
d[i]+=d[i/j];
}
}
if(j*j==i){
n+=1;
d[i]+=d[j];
}
n+=2;// 1 and i
d[i]+=n;
d[i]/=(n-1);
}
scanf("%d",&T);
while(T--){
scanf("%d",&n);
printf("Case %d: %.6lf\n",++iCase,d[n]);
}
return 0;
}