LightOJ 1038 - Race to 1 Again (给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望。)(概率)
Posted 老板,来一盆泪流满面
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LightOJ 1038 - Race to 1 Again (给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望。)(概率)相关的知识,希望对你有一定的参考价值。
题意:http://www.lightoj.com/volume_showproblem.php?problem=1038
题意:给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望。
设一个数的约数有M个,E[n] = (E[a[1]]+1)/M+(E[a[2]]+1)/M+...+(E[a[M]]+1)/M
一个数最大的约数是它自己。
则有,E[n] = (E[a[1]]+1)/M+(E[a[2]]+1)/M+...+(E[n]+1)/M
(M-1)*E[n]=E[a[1]]+E[a[2]]+...+E[a[M-1]]+M
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<vector> #include<math.h> #include<string> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define N 100006 #define Lson rood<<1 #define Rson rood<<1|1 double dp[N]; void Q() { dp[1]=0; for(int i=2;i<N;i++) { double sum=0; int ans=-1; for(int j=1;j<=sqrt(i);j++) { if(i%j==0) { sum+=dp[j];ans++; if(j!=i/j) { sum+=dp[i/j];ans++; } } } sum+=ans+1; dp[i]=sum/ans; } } int main() { Q(); int T,t=1,n; scanf("%d",&T); while(T--) { scanf("%d",&n); printf("Case %d: %.10f\n",t++,dp[n]); } return 0; }
以上是关于LightOJ 1038 - Race to 1 Again (给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望。)(概率)的主要内容,如果未能解决你的问题,请参考以下文章
LightOJ 1038 Race To 1 Again(概率DP)
LightOJ - 1038 Race to 1 Again(期望)
LightOJ 1038 - Race to 1 Again (给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望。)(概率)