LightOJ 1038 - Race to 1 Again(期望+DP)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1038

题意是:给你一个N (1 ≤ N ≤ 105) 每次N都随机选一个因子d,然后让N=N/d, 求N变成1的次数的期望;

当 N = 2 时 2有两个因子:1,2

E[2] = E[1]/2 + E[2]/2 + 1;因此可以求出E[2];

当N = 8 时 8有4个因子1 2 4 8;

E[8] = E[1]/4 + E[2]/4 + E[4]/4 + E[8]/4+ 1;因此可以求出E[8];

......

我们用 E[i] 表示 i 变成 1 的次数期望;那么E[i] = E[a[1]]/cnt + E[a[2]]/cnt + ... + E[a[cnt]]/cnt + 1;(加1是因为本次除了一次);

其中cnt为 i 的因子个数,a数组为 i 的因子集合,如果按从小到大的顺序排列 则 a[1] = 1, a[cnt] = i;

所以上式中的a[cnt]替换为i;整理可得 E[i] = (E[a[1]]+E[a[2]]+ ... +E[a[cnt-1]]+cnt)/(cnt-1);

#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
using namespace std;
#define N 100005
#define met(a, b) memset(a, b, sizeof(a))
#define MOD 110119

typedef long long LL;

double dp[N];

void Init()
{
    dp[1] = 0;
    for(int i=2; i<N; i++)
    {
        double sum = 0;
        int cnt = 0;
        for(int j=1; j*j<=i; j++)
        {
            if( i%j == 0 )
            {
                cnt++;
                sum += dp[j];
                if(j*j != i)
                {
                    cnt ++;
                    sum += dp[i/j];///j是i的因子,i/j也是i的因子;
                }
            }
        }
        sum += cnt;
        dp[i] = sum/(cnt-1);
    }
}

int main()
{
    Init();
    int T, t = 1, n;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        printf("Case %d: %.6f\n", t++, dp[n]);
    }
    return 0;
}

时间: 2024-10-10 14:51:14

LightOJ 1038 - Race to 1 Again(期望+DP)的相关文章

LightOJ 1038 Race to 1 Again 期望 记忆化dp

题目链接:点击打开链接 1038 - Race to 1 Again PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Rimi learned a new thing about integers, which is - any positive integer greater than 1 can be divided by its divisors. So, he is now playin

Lightoj 1038 - Race to 1 Again (概率DP)

题目链接: Lightoj  1038 - Race to 1 Again 题目描述: 给出一个数D,每次可以选择数D的一个因子,用数D除上这个因子得到一个新的数D,为数D变为1的操作次数的期望为多少? 解题思路: 概率DP咯,对于只知道期望是:E(X) = X1*p(X1) + X2*p(X2) + …… + Xn*p(Xn)的窝,拿这个题目没有一点办法.然后看了讨论版,发现总会有一些神人存在. 求操作次数的期望时,先设定第i个因子给期望的贡献为Ti,那么有:E = (T1 + T2 + T3

LightOJ 1038 - Race to 1 Again 【DP】

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1038 题意:题目很短,不叙述了. 解法:dp 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include <complex> #include <string> #include <functio

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

LightOJ - 1038 Race to 1 Again 递推+期望

题目大意:给出一个数,要求你按一定的规则将这个数变成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]

LightOJ 1038 Race to 1 Again

每次一个数,问不断除以约数,到1的时候,除的个数的期望. 怕超时,打表,递推公式: (n的约数的个数(不含本身))*a[n]=a[n的约数(除了本身)](求和)+约数的个数(包含本身); 用a[8]举个例子: a[8]=1/4*(a[1]+1)+1/4*(a[2]+1)+1/4*(a[4]+1)+1/4*(a[8]+1); 每次约去就让次数加一~ 完美~ #include <iostream>#include <functional>#include <algorithm&g

LightOJ 1030 Discovering Gold (概率/期望DP)

题目链接:LightOJ - 1030 Description You are in a cave, a long cave! The cave can be represented by a \(1 \times N\) grid. Each cell of the cave can contain any amount of gold. Initially you are in position \(1\). Now each turn you throw a perfect \(6\) s

【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