LightOJ - 1038 Race to 1 Again 递推+期望
2015-06-04 14:46
357 查看
题目大意:给出一个数,要求你按一定的规则将这个数变成1
规则如下,假设该数为D,要求你在[1,D]之间选出D的因子,用D除上这个因子,然后继续按该规则运算,直到该数变成1
问变成1的期望步数是多少
解题思路:递推,设该数为D,有N个因子,分别是1,n1,n2,n3…nn-2,D,
那么选到每个因子的概率都是1/N,除非选到D,不然选到其他因子的话都要多1步,然后再计算D除以该因子的期望
这就能得到公式了,设dp[D]为数D按规则变成1的期望步数
那么dp[D] = 1/N * (dp[D/1] + 1) + 1 / N * (dp[D/n1] + 1) + 1/ N * (dp[D/n2] + 1) + … + 1/N * (dp[D/nn-2] + 1) + 1/N * (dp[D / D] + 1)
化简得 dp[D] = 1 / (N-1) * (dp[D/n1] + dp[D/n2] + … + dp[D/nn-2] + N)
规则如下,假设该数为D,要求你在[1,D]之间选出D的因子,用D除上这个因子,然后继续按该规则运算,直到该数变成1
问变成1的期望步数是多少
解题思路:递推,设该数为D,有N个因子,分别是1,n1,n2,n3…nn-2,D,
那么选到每个因子的概率都是1/N,除非选到D,不然选到其他因子的话都要多1步,然后再计算D除以该因子的期望
这就能得到公式了,设dp[D]为数D按规则变成1的期望步数
那么dp[D] = 1/N * (dp[D/1] + 1) + 1 / N * (dp[D/n1] + 1) + 1/ N * (dp[D/n2] + 1) + … + 1/N * (dp[D/nn-2] + 1) + 1/N * (dp[D / D] + 1)
化简得 dp[D] = 1 / (N-1) * (dp[D/n1] + dp[D/n2] + … + dp[D/nn-2] + N)
[code]#include<cstdio> #include<cstring> #include<cmath> #define maxn 100010 double dp[maxn]; void init() { dp[1] = double(0); for(int i = 2; i <= 1e5; i++) { int cnt = 0; dp[i] = 0.0; for(int j = 1; j * j <= i; j++) { if(i % j == 0 && i / j != j) { cnt += 2; dp[i] += dp[j] + dp[i / j] + 2; } if(j * j == i) { cnt += 1; dp[i] += dp[j] + 1; } } dp[i] /= (cnt - 1); } } int main() { init(); int test, cas = 1, n; scanf("%d", &test); while(test--) { scanf("%d", &n); printf("Case %d: %.10lf\n", cas++, dp ); } return 0; }
相关文章推荐
- poj2709Painter
- IBM aix资料
- 2 walks Once again
- CSUOJ 1637 Yet Satisfiability Again!
- Gmail架构相关资料收集
- 简单的介绍人工智能的机器学习
- 简单的介绍人工智能的机器学习
- pthread_cond_wait()
- Opencv研读笔记:haartraining程序之cvCreateMTStumpClassifier函数详解~
- OAI编译EPC流程
- SAI教程,真人照片转手绘
- Algorithms—70.Climbing Stairs
- IDF实验室之初探乾坤Fuck you brain
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法
- [CodeForces312C]The Closest Pair[实现][贪心]
- HDU 1496 Train Problem I 火车问题1(桟,水)
- OC release之后 retainCount为何为1
- poj 3250 Bad Hair Day (单调栈)
- Light 1021 - Painful Bases (状压dp)
- Algorithms—219.Contains Duplicate II