UVa 11762 (期望 DP) Race to 1

设f(x)表示x转移到1需要的次数的期望,p(x)为不超过x的素数的个数,其中能整除x的有g(x)个

则有(1-g(x)/p(x))的概率下一步还是转移到x,剩下的情况各有1/p(x)的概率转移到x/y

根据全期望公式,f(x) = 1 + (1-g(x)/p(x)) * f(x) + sum{ 1/p(x) * f(x/y) | y是能整除x且不超过x的素数 }

代码是用记忆化搜索计算f的

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 using namespace std;
 5
 6 const int maxn = 1000000;
 7 bool vis[maxn + 10];
 8 int prime[100000], pcnt = 0;
 9
10 void prime_table()
11 {
12     int m = sqrt(maxn + 0.5);
13     for(int i = 2; i <= m; i++) if(!vis[i])
14         for(int j = i*i; j <= maxn; j += i) vis[j] = true;
15     for(int i = 2; i <= maxn; i++) if(!vis[i]) prime[pcnt++] = i;
16 }
17
18 double d[maxn + 10];
19
20 double dp(int x)
21 {
22     if(x == 1) return 0;
23     if(vis[x]) return d[x];
24     vis[x] = 1;
25     double& ans = d[x];
26     int p = 0, g = 0;
27     for(int i = 0; i < pcnt && prime[i] <= x; i++)
28     {
29         p++;
30         if(x % prime[i] == 0) { ans += dp(x / prime[i]); g++; }
31     }
32     ans = (ans + p) / g;
33     return ans;
34 }
35
36 int main()
37 {
38     //freopen("in.txt", "r", stdin);
39
40     prime_table();
41     memset(vis, false, sizeof(vis));
42     int T;
43     scanf("%d", &T);
44     for(int kase = 1; kase <= T; kase++)
45     {
46         int x;
47         scanf("%d", &x);
48         printf("Case %d: %.10f\n", kase, dp(x));
49     }
50
51     return 0;
52 }

代码君

时间: 2024-10-10 16:00:40

UVa 11762 (期望 DP) Race to 1的相关文章

UVa 11427 (期望 DP) Expect the Expected

设d(i, j)表示前i局每局获胜的比例均不超过p,且前i局共获胜j局的概率. d(i, j) = d(i-1, j) * (1-p) + d(i-1, j-1) * p 则只玩一天就就不再玩的概率Q = sum{d(n, i) | 0 ≤ i ≤ p*n} 那么期望为 这是一个无穷级数,可以用高数的一些知识来解决. 另1-Q = t 将1-Q带入t,并将左边的Q乘过去得: 书上还介绍了一种更简单的方法,假设所求期望为e 第一天玩完就去睡觉,概率为Q,期望为1:第一天玩得高高兴兴,概率为1-Q,

Uva 11600 期望DP

题意:n个城市,相互可达(有n(n-1)/2条边),其中有一些道路上面有妖怪,现在,从1号城市出发,随机挑取一个城市走去,这个道路上的妖怪就会被消灭,求: 在平均情况下,需要走多少步,使得任意两个城市之间,可以不经过妖怪而相互可达: (n<=30) 分析: 1.根据题意可知,我们要将每一个可以不经过妖怪的一个个连通分量找出来: 2.然后从一个连通分量走到另一个连通分量,这时肯定进过妖怪: 3.一个一个连通分量,完成了哪几个连通分量,需要保存,这时,就用集合的方式保存: 4.从一个连通分量,走到另

uva 11762 - Race to 1(马尔可夫)

题目链接:uva 11762 - Race to 1 题目大意:给出一个整数N,每次可以在不超过N的素数中随机选择一个P,如果P是N的约数,则把N变成N/P,否则N不变.问平均情况下需要多少次选择,才能把N变成1. 解题思路:马尔可夫,例如N=6时,f(6)=1+f(6)?13+f(4)?13+f(2)?13,1是只第一次转移,后面分别对应的是选择5,2,3的情况.所以有f(x)=∑f(x/y)+p(x)g(x),p(x)为不超过x的素数个数,g(x)为是x因子的素数个数. #include <

UVA 11762 - Race to 1(概率)

UVA 11762 - Race to 1 题意:给定一个n,每次随即选择一个n以内的质数,如果不是质因子,就保持不变,如果是的话,就把n除掉该因子,问n变成1的次数的期望值 思路:tot为总的质数,cnt为质因子个数,那么f(n)=(1?cnt/tot)?f(n)+∑f(n/prime)?(1/tot),然后利用记忆化搜索去做即可 代码: #include <stdio.h> #include <string.h> const int N = 1000005; int t, n,

【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp

题目描述 Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮.B 君发现这个游戏很难,于是想到了这样的一个

HDOJ 1145 So you want to be a 2n-aire? 期望DP

期望DP So you want to be a 2n-aire? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 267    Accepted Submission(s): 197 Problem Description The player starts with a prize of $1, and is asked a seq

uva 12723 概率dp

Dudu is a very starving possum. He currently stands in the first shelf of a fridge. This fridge iscomposed of N shelves, and each shelf has a number Qi (1 ≤ i ≤ N) of food. The top shelf, whereDudu is, is identified by the number 1, and the lowest is

HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由于得到每张卡片的状态不知道,所以用状态压缩,dp[i] 表示这个状态时,要全部收齐卡片的期望. 由于有可能是什么也没有,所以我们要特殊判断一下.然后就和剩下的就简单了. 另一个方法就是状态压缩+容斥,同样每个状态表示收集的状态,由于每张卡都是独立,所以,每个卡片的期望就是1.0/p,然后要做的就是要去重,既然

Topcoder SRM656div1 250 ( 期望DP )

Problem Statement    Charlie has N pancakes. He wants to serve some of them for breakfast. We will number the pancakes 0 through N-1. For each i, pancake i has width i+1 and deliciousness d[i].Charlie chooses the pancakes he is going to serve using t