题目:戳这里
题意:一个数字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 }