Light OJ 1038 - Race to 1 Again(数学-期望)

题目链接

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

题目大意

对于一个数字D, D可以通过不停的除以自身因子(包括1和自身)使自己变得更小,最后为1。现在求一个数最后变为1需要花费次数的期望。

代码如下

#include<bits/stdc++.h>
using namespace std;

double dp[100007];
int arr[100007];

void solve(int cases)
{
    int n;
    scanf("%d", &n);
    printf("Case %d: %.8f\n", cases, dp[n]);
}

void init()
{
    memset(dp, 0, sizeof(dp));
    memset(arr, 0, sizeof(arr));
    for(int i=1; i<=100000; ++ i)
    {
        if(i != 1)
            dp[i] = (dp[i] + arr[i] + 1) / arr[i];

        for(int j=i*2; j<=100000; j+=i)
        {
            arr[j] ++;
            dp[j] += dp[i];
        }
    }
}

int main()
{
    init();
    int t;
    scanf("%d", &t);
    for(int i=1; i<=t; ++ i)
        solve(i);
    return 0;
}
posted @ 2017-02-26 15:47  aiterator  阅读(170)  评论(0编辑  收藏  举报