loj 1038(dp求期望)

时间:2024-06-25 14:36:50

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25915

题意:求一个数不断地除以他的因子,直到变成1的时候 除的次数的期望。

思路:设一个数的约数有num个,E[n] = (E[a[1]]+1)/num+(E[a[2]]+1)/num+...+(E[a[num]]+1)/num+1  ,而a[num]==n,于是整理得:

E[n]=(E[a[1]]+E[a[2]]+...+E[a[num-1]]+num)/(num-1)。

然后预处理出所有的结果。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std; int n;
double dp[]; void Get_Dp()
{
dp[]=;
for(int i=;i<=;i++){
int cnt=;
double sum=;
for(int j=;j*j<=i;j++){
if(i%j==){
cnt++;
sum+=dp[j];
if(j*j!=i){
cnt++;
sum+=dp[i/j];
}
}
}
dp[i]=(sum+cnt)/(cnt-);
}
} int main()
{
Get_Dp();
int _case,t=;
scanf("%d",&_case);
while(_case--){
scanf("%d",&n);
printf("Case %d: %.10f\n",t++,dp[n]);
}
return ;
}