题意:http://www.lightoj.com/volume_showproblem.php?problem=1038

题意:给一个数,用这个数的因数除以这个数,直到为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+...+(E[n]+1)/M

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

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<vector>
#include<math.h>
#include<string>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define N 100006
#define Lson rood<<1
#define Rson rood<<1|1
double dp[N];
void Q()
{
    dp[1]=0;
    for(int i=2;i<N;i++)
    {
        double sum=0;
        int ans=-1;
        for(int j=1;j<=sqrt(i);j++)
        {
            if(i%j==0)
            {
                sum+=dp[j];ans++;
                if(j!=i/j)
                {
                    sum+=dp[i/j];ans++;
                }
            }
        }
        sum+=ans+1;
        dp[i]=sum/ans;
    }
}
int main()
{
    Q();
    int T,t=1,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        printf("Case %d: %.10f\n",t++,dp[n]);
    }
    return 0;
}

 

posted on 2017-11-08 11:06  云胡不喜。  阅读(91)  评论(0编辑  收藏  举报