您的位置:首页 > 其它

uva11762 Race to 1 概率dp求期望+记忆化搜索

2014-07-04 08:42 381 查看
题目链接



#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=1000000+100;
int n,cnt;
int prime[MAXN],vis[MAXN];
double dp[MAXN];
void get_prime()
{
    cnt=0;
    memset(vis,0,sizeof(vis));
    int m=(int)sqrt(MAXN+0.5);
    for(int i=2;i<=m;i++)
        for(int j=i*i;j<MAXN;j+=i)
            vis[j]=1;
    for(int i=2;i<MAXN;i++)
        if(!vis[i])
            prime[cnt++]=i;
}
double dfs(int x)
{
    if(x==1) return 0.0;
    if(vis[x])
        return dp[x];
    vis[x]=1; 
    int g=0,p=0;
    dp[x]=0;
    for(int i=0;i<cnt && prime[i]<=x ;i++)
    {
         p++;
         if(x % prime[i] == 0)
         {
             g++;
             dp[x]+=dfs(x/prime[i]);
         }
    }
    dp[x]=(dp[x]+p)/g;
    return dp[x];

}
int main()
{
    freopen("text.txt","r",stdin);
    int T,kase=0;
    get_prime();
    scanf("%d",&T);
    while(T--)
    {
        kase++;
        scanf("%d",&n);
        memset(vis,0,sizeof(vis));
        printf("Case %d: %.10lf\n",kase,dfs(n));
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: