这题就是寻找各种可能到达1的路径,然后求期望值,我们可以把它分解来看,因为路径长度为它走过的所有的点所需路径加上如果到达某一点可以继续走下去的话所增加的路径,然后期望就是总的路径除以所有有可能往下走的点(如果到达1,那么可能的点就是0,除以0是不行的,所以就直接返回0),由从某一点出发到下一点可能的路径值,逐步递推到1,再返回就可以得到结果。
#include <stdio.h>
#include <string.h>
bool jud[1000000+10];
int prime[200000];
int num=0;
void init()
{
int i,j;
memset(jud,true,sizeof(jud));
for(i=2;i<=1000000;i++)
{
if(jud[i])
{
prime[num++]=i;
for(j=i;j<=1000000;j=j+i)
jud[j]=false;
}
}
}
double solve(int n)
{
double sum=0;
int i,j=0;
for(i=0;i<num&&prime[i]<=n;i++)
{
if(n%prime[i]==0)
{
sum+=solve(n/prime[i]);
j++;
}
}
sum+=i;
if(j==0)
return 0;
else
return sum/j;
}
int main()
{
int t;
scanf("%d",&t);
init();
int i;
for(i=1;i<=t;i++)
{
int d;
scanf("%d",&d);
double ans=solve(d);
printf("Case %d: %lf\n",i,ans);
}
return 0;
}