lightoj 1038 Race to 1 Again

  题意:给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望。

  设一个数的约数有M个,E[n] = (E[a[1]]+1)/M+(E[a[2]]+1)/M+...+(E[a[M]]+1)/M

  一个数最大的约数是它自己。

  则有,E[n] = (E[a[1]]+1)/M+(E[a[2]]+1)/M+...+(n+1)/M

  (M-1)*E[n]=E[a[1]]+E[a[2]]+...+E[a[M-1]]+M

#include<stdio.h>
#include<math.h>
#define maxn 100010

double dp[maxn];
void Init()
{
    dp[1]=0;
    for(int i=2;i<maxn;i++)
    {
        double sum=0;
        int cnt=0;
        for(int j=1;j<=sqrt(i*1.0);j++)
            if(i%j==0)
            {
                sum+=dp[j];cnt++;
                if(j!=i/j)
                {
                    sum+=dp[i/j];cnt++;
                }
            }
        sum+=cnt;
        dp[i]=sum/(cnt-1);
    }
}
int main()
{
    Init();
    int T,n,cas=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        printf("Case %d: %lf
",cas++,dp[n]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yongren1zu/p/3249239.html