lightoj1038(数学概率与期望)
Posted 冰冻三尺 非一日之寒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lightoj1038(数学概率与期望)相关的知识,希望对你有一定的参考价值。
题意:输入一个数N,N每次被它的任意一个因数所除 变成新的N 这样一直除下去 直到 N变为1
求变成1所期望的次数
解析:
d[i] 代表从i除到1的期望步数;那么假设i一共有c个因子(包括1和本身)
d[i] = ( d[1] + d[a2] + d[a3] + d[a4] ..... + d[i] + c) / c; (加c是因为每一个期望值都会加1,因为多出一步才变成它(即第一次从i到它的因子的那一步))
把右边的dp[i] 移到左边 化简得
dp[i] = ( d[1] + d[a2] + d[a3] + d[a4] ..... + d[i-1] + c) / (c-1)
注意:不能太暴力求因数,折半求 还有。。。。mmp。。不要用Java做。。。。
这一题与lightoj1030 的思路一样 都是期望dp
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int maxn = 100005; int cnt; int main() { int res = 0; double dp[maxn]; mem(dp,0); int temp; for(int i=2;i<maxn;i++) { cnt = 0; double sum = 0; for(int j=1;j<=sqrt(i+0.5);j++) { if(i % j == 0) { sum += dp[j]; cnt++; if(j != i/j){ sum += dp[i/j]; cnt++; } } } dp[i] = (sum + cnt)/(double)(cnt-1); } int T; scanf("%d",&T); while(T--) { scanf("%d",&temp); printf("Case %d: %.10f\n",++res,dp[temp]); } return 0; }
以上是关于lightoj1038(数学概率与期望)的主要内容,如果未能解决你的问题,请参考以下文章
LightOJ 1038 - Race to 1 Again (给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望。)(概率)