Lightoj 1038

题目:戳这里

题意:一个数字n不断迭代地除以自身的因子得到1。求这个过程中操作除法次数的期望。

解题思路:

求概率基本都是从一个最基础的状态开始延伸推出公式,得出答案。
因为每个数都有个共同的最终状态1,所以我们从1向n推(注意用到期望的可加性,可加性不需要事件相互独立
可以推出期望公式:
E=1/n * 1 + (n - 1)/n *(1 + E1 + ... + En)
Ei表示D除以一个除数后值为Di时,Di的期望。(第一道自己ac的该类型题目,记录一下

附ac代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 1e5 + 10;
 5 const int inf = 0x3f3f3f3f;
 6 const ll mod = 998244353;
 7 double cnt[maxn];
 8 double dp[maxn];
 9 int main() {
10     int t, n;
11     dp[1] = 1.0;
12 
13     for(int i = 1; i <= maxn; ++i)
14     {
15         if(cnt[i])
16         dp[i] /= cnt[i];
17         for(int j = 2; j * i <= maxn; ++j)
18         {
19             dp[i * j] += dp[i] + 1.0;
20             cnt[i * j] += 1.0;
21         }
22     }
23     scanf("%d", &t);
24     dp[1] = 0;
25     for(int cas = 1; cas <= t; ++cas)
26     {
27         scanf("%d", &n);
28         printf("Case %d: %f
", cas, dp[n]);
29     }
30 
31     return 0;
32 }
View Code
原文地址:https://www.cnblogs.com/zmin/p/9733515.html