UVA 11762 Race To 1 [期望DP]
2012-10-30 01:25
507 查看
给一个数N,每步随机选一个不大于N的质数X,若X整除N,则N=N/X,否则N不变。求N变为1的期望步数。
常规的期望DP,先预处理不大于N的质数个数以及N的质因数,d
=p0*d
+p1*d[n/d1]+p1*d[n/d2]...+1,其中d1,d2..是n的质因数,p0为选中一个质数不为n的质因数的概率,移项即可得到d
的表达式。
常规的期望DP,先预处理不大于N的质数个数以及N的质因数,d
=p0*d
+p1*d[n/d1]+p1*d[n/d2]...+1,其中d1,d2..是n的质因数,p0为选中一个质数不为n的质因数的概率,移项即可得到d
的表达式。
#include <string.h> #include <stdio.h> #include <vector> #define MAXN 1000005 using namespace std; int cas, n; int pri[MAXN], totp[MAXN]; double d[MAXN]; vector<int> vec[MAXN]; void init(){ pri[1] = 1; for (int i = 2; i < MAXN; i++) if (!pri[i]){ vec[i].push_back(i); for (int j = i*2; j < MAXN; j += i) pri[j] = 1, vec[j].push_back(i); } for (int i = 1; i < MAXN; i++) totp[i] = totp[i-1] + (pri[i]==0); memset(d, 0, sizeof d); } double dp(int n) { if (n == 1) return 0; if (d != 0) return d ; double tt = 0; for (int i = 0; i < vec .size(); i++) tt += dp(n/vec [i])/totp ; return d = (tt + 1) / (vec .size()*1.0/totp ); } int main(){ //freopen("test.in","r",stdin); scanf("%d", &cas); init(); for (int ca = 1; ca <= cas; ca++) { scanf("%d", &n); printf("Case %d: %.10f\n", ca, dp(n)); } return 0; }
相关文章推荐
- UVa 11762 - Race to 1 (概率 期望 DP 马尔可夫过程)
- Uva11762 Race to 1 数学期望
- UVA 11762 概率dp+期望
- [uva 11762]Race to 1[概率DP]
- UVA 11762 Race to 1(记忆化+期望)
- UVa 11762 Race to 1 / 概率DP
- UVA 11762 Race to 1 概率DP
- UVA 11762 Race to 1 dp+概率
- UVa 11762 Race to 1 (数学期望 + 记忆化搜索)
- [UVA11762] Race to 1 && 数学期望
- UVa 11762 (期望 DP) Race to 1
- [uva 11762]Race to 1[概率DP]
- uva11762 Race to 1 概率dp求期望+记忆化搜索
- UVA 11762 Race to 1
- UVALive 6175 Maximum Random Walk 期望+概率dp
- UVa 11427 (期望 DP) Expect the Expected
- UVA 11427 Expect the Expected (概率dp+推公式求期望 详解)
- LightOJ 1038 - Race to 1 Again(期望DP)
- lightoj1038 - Race to 1 Again(期望DP)
- uva11176 - Winning Streak 数学期望 DP