lightoj1038_概率dp

Posted _lm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lightoj1038_概率dp相关的知识,希望对你有一定的参考价值。

题目链接:http://lightoj.com/volume_showproblem.php?problem=1038

给定一个n,然后每次可以找到n的一个因子x包括1和本身, 然后n=n/x,直到n为1为止,求次数期望。

dp[n]表示n到1的期望次数,例如dp[8] = (dp[1]+dp[2]+dp[4]+dp[8])*(1/4) + 1,化简得dp[8] = (dp[1]+dp[2]+dp[4] + 4) / 3;

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cstdio>
 6 #include <vector>
 7 #include <ctime>
 8 #include <queue>
 9 #include <list>
10 #include <set>
11 #include <map>
12 using namespace std;
13 #define INF 0x3f3f3f3f
14 typedef long long LL;
15 
16 double dp[100010];
17 double solve(int n)
18 {
19     if(dp[n] != -1)
20         return dp[n];
21     double res = 0;
22     double con = 2;
23     for(int i = 2; i * i <= n; i++)
24     {
25         if(n % i != 0)
26             continue;
27         con++;
28         res += solve(i);
29         if(i * i != n){
30             res += solve(n / i);
31             con++;
32         }
33     }
34     res += con;
35     res /= con-1;
36     dp[n] = res;
37     return res;
38 }
39 int main()
40 {
41     int t, n;
42     scanf("%d", &t);
43     for(int i = 1; i < 100001; i++)
44         dp[i] = -1;
45     dp[1] = 0;
46     for(int ca = 1; ca <= t; ca++)
47     {
48         scanf("%d", &n);
49         printf("Case %d: %.6f\n", ca, solve(n));
50     }
51     return 0;
52 }

 

以上是关于lightoj1038_概率dp的主要内容,如果未能解决你的问题,请参考以下文章

LightOJ 1038 Race To 1 Again(概率DP)

LightOJ - 1038(概率&DP)

lightoj1038(数学概率与期望)

[算法]概率与期望DP

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

LightOJ - 1079 概率dp