uva 11762

<pre name="code" class="cpp">#include <bits/stdc++.h>

using namespace std;
#define maxn 1000000+10

bool isprime[maxn];
int  mark[maxn];
double dp[maxn];
int T, n;

void make_prime(int num)
{
    int tmp=sqrt(num+0.5);
    memset(isprime,true,sizeof(isprime));
    for(int i=2; i<=tmp; i++)
        if(isprime[i])
            for(int j=i*i; j<=num; j+=i)
                isprime[j]=false;
    isprime[0] = false;
    isprime[1] = false;

    int cnt = 0;
    for(int i=2; i<=num; i++)
        if(isprime[i]) mark[i] = ++cnt;
        else mark[i] = cnt;
}

double solve(int m)
{
    int k = 0;
    if(m == 1) return 0;

    if(dp[m]) return dp[m];
    for(int i=2; i<=m; i++)
        if(isprime[i] && m%i == 0)
            {
                dp[m] += solve(m/i)/mark[m];
                k++;
            }

    dp[m] += mark[m]/(double)k;
    return dp[m];
}

int main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    cin>>T;
    make_prime(maxn);
    while(T--)
    {
        memset(dp, 0, sizeof(dp));
        cin>>n;
        double ans = solve(n);
        printf("%.10lf\n", ans);
    }
    return 0;
}
				
时间: 2024-10-11 01:41:09

uva 11762的相关文章

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,

UVA - 11762 - Race to 1 记忆化概率

Dilu have learned a new thing about integers, which is - any positive integer greater than 1 can bedivided by at least one prime number less than or equal to that number. So, he is now playing withthis property. He selects a number N. And he calls th

UVA - 11762 Race to 1

Dilu have learned a new thingabout integers, which is - any positive integer greater than 1 can be divided byat least one prime number less than or equal to that number. So, he is nowplaying with this property. He selects a number N. And he calls thi

UVA 11762 Race to 1(记忆化+期望)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20869 [思路] DP+期望. 设f[x]表示从x转移到1的期望操作次数,则有: f[x]=1+f[x]*(1-g[x]/p[x])+sigma(f[x][y])/p[x] 进一步为: f[x]=(sigma(f[x/y])+p[x])/g[x] 其中p[x]表示1..x的素数个数,p[x]表示素数中可以整除x的个数. 保留vis可以节约时间. [代码] 1 #i

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 #i

Race to 1 UVA - 11762 (记忆dp概率)

#include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <cma

【UVA】【11762】Race to 1(得到1)

数学期望/马尔可夫过程 DP/记忆化搜索 刘汝佳老师白书上的例题…… 1 //UVA 11762 2 #include<vector> 3 #include<cstdio> 4 #include<cstring> 5 #include<cstdlib> 6 #include<iostream> 7 #include<algorithm> 8 #define rep(i,n) for(int i=0;i<n;++i) 9 #def

UESTC 2014 Summer Training #10 Div.2

B.Race to 1 UVA 11762 第一次接触概率dp,完全没想到是dp...没想到能递推出来0 0 首先需要知道 总的期望=每件事的期望×每件事发生的概率 然后可以根据这个来写递推公式,也是dp? 假设不小于x的质数有m个,x的质因子有n个(种 更确切),那么在求X的期望时,可以考虑由他能转移过去的状态转移,X,X/pi p是x的质因子 所以不难得出E(x) = 1+(m-n)/mE(X)+1/msigmaE(X/pi) 注意会加1,因为X转移到后面的情况,就多了一步 //Update