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*/