UVA 11762 Race to 1 dp+概率

来源:互联网 发布:java的继承和多态区别 编辑:程序博客网 时间:2024/05/10 12:01
#include <stdio.h>#include <string.h>#include <math.h>#include <iostream>using namespace std;const int maxn=1e6+10;const int maxc=1e5;double f[maxn];int prime[maxc],num,vis[maxn];void sieve(int n)  //筛素数{    int m=(int)sqrt(n+0.5);//避免浮点误差    memset(vis,0,sizeof(vis));    for(int i=2;i<=m;i++)if(!vis[i])        for(int j=i*i;j<=n;j+=i)vis[j]=1;}//生成素数表,存在prime数组中,返回素数个数int primes(int n){    sieve(n);    int t=0;    for(int i=2;i<=n;i++)if(!vis[i])        prime[t++]=i;    return t;}double dfs(int x){    if(x==1)return 0;    if(vis[x])return f[x];    vis[x]=1;    int p,g,i;    p=g=0;    for(i=0;prime[i]<=x&&i<num;i++)//限制i<num,或者求素数的时候多求一个    {        p++;        if(x%prime[i]==0)        {            g++;            f[x]+=dfs(x/prime[i]);        }    }    f[x]=(f[x]+p)/g;    return f[x];}int main(){    num=primes(1000000);    memset(vis,0,sizeof(vis));    int T,tt=0;    scanf("%d",&T);    while(T--)    {        int n;        scanf("%d",&n);        printf("Case %d: %.10lf\n",++tt,dfs(n));    }    return 0;}/*    f[x]=1+f[x]*(1-g[x]/p[x])+∑f[x/y]*1/p[x];p[x]为不超过x的素数个数,g[x]为p[x]中是因子的个数,y为x的因子    转换下:f[x]=(∑f[x/y]+p)/g*/

原创粉丝点击