Loading

UVA 11762 Race to 1 数学期望 概率 记忆化搜索

给出一个整数N 每次可以在不超过N的素数中随机选择以个P, 如果P是N的约数,则把N变成N/P ,否则N不变 。 问平均状况下需要多少次随机选择才能把N变为1 ? 

N<=1e6 

 

 

 

 

int prime[maxn];
int vis[maxn];
double f[maxn];

int euler_sieve(int n) {
    int cnt = 0;
    for (int i = 2; i <= n; i++) {
        if (!vis[i]) prime[cnt++] = i;
        for (int j = 0; j < cnt; j++) {
            if (i * prime[j] > n) break;
            vis[i * prime[j]] = 1;
            if (i % prime[j] == 0) break;
        }
    }
    return cnt;
}

bool mp[maxn];
int p_cnt;

double dp(int x) {
    if (x == 1) return 0;
    if (mp[x]) return f[x];
    mp[x] = 1;
    double& ans = f[x];
    int g = 0, p = 0;
    ans = 0;
    for (int i = 0; i < p_cnt && prime[i] <= x; i++) {
        p++;
        if (x % prime[i] == 0) {
            g++;
            ans += dp(x / prime[i]);
        }
    }
    ans = (ans + p) / g;
    return ans;
}


int main() {    
    p_cnt = euler_sieve(1000005);
    int T;
    int n;
    int kase = 1;
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &n);
        printf("Case %d: %.7f\n", kase++ ,dp(n));
    }
}

 

posted @ 2020-07-02 21:56  MQFLLY  阅读(155)  评论(0编辑  收藏  举报