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

来源:互联网 发布:网络助手怎么用 编辑:程序博客网 时间:2024/04/29 22:46

题目链接


#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;}

0 0