Race to 1 Again LightOJ - 1038

Race to 1 Again LightOJ - 1038

题意:有一个数字D,每次把D变为它的一个因数(变到所有因数的概率相等,可能是本身),变到1后停止。求对于某个初始的D变到1的期望步数。

x的因子有p[1],...,p[k]

那么ans[x]=1/k*(ans[p[1]]+1)+...+1/k*(ans[p[k]]+1)
=1/k*(ans[p[1]]+...+ans[p[k-1]])+1/k*ans[p[k]]+1
(k-1)/k*ans[x]=1/k*(ans[p[1]]+...+ans[p[k-1]])+1
ans[x]=1/(k-1)*(ans[p[1]]+...+ans[p[k-1]])+k/(k-1)

 1 #include<cstdio>
 2 #include<cmath>
 3 using namespace std;
 4 int k,T,n;
 5 double anss,ans[100100];
 6 int main()
 7 {
 8     int i,j,t;
 9     for(i=2;i<=100000;i++)
10     {
11         k=2;
12         anss=0;
13         for(j=2;j<sqrt(i);j++)
14         {
15             if(i%j!=0)    continue;
16             anss=anss+ans[j]+ans[i/j];
17             k+=2;
18         }
19         t=sqrt(i);
20         if(t*t==i)
21         {
22             anss+=ans[t];
23             k++;
24         }
25         ans[i]=anss/(k-1)+(double)k/(k-1);
26     }
27     scanf("%d",&T);
28     for(i=1;i<=T;i++)
29     {
30         scanf("%d",&n);
31         printf("Case %d: %.9f\n",i,ans[n]);
32     }
33     return 0;
34 }
posted @ 2017-11-08 16:35  hehe_54321  阅读(158)  评论(0编辑  收藏  举报
AmazingCounters.com