LightOJ 1038 - Race to 1 Again (给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望。)(概率)

Posted 老板,来一盆泪流满面

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LightOJ 1038 - Race to 1 Again (给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望。)(概率)相关的知识,希望对你有一定的参考价值。

题意: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;
}

 

以上是关于LightOJ 1038 - Race to 1 Again (给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望。)(概率)的主要内容,如果未能解决你的问题,请参考以下文章

LightOJ 1038 Race To 1 Again(概率DP)

LightOJ - 1038 Race to 1 Again(期望)

LightOJ 1038 - Race to 1 Again (给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望。)(概率)

lightoj1038_概率dp

LightOJ - 1038(概率&DP)

lightoj1038(数学概率与期望)