题意:给一个数,用这个数的因数除以这个数,直到为1时,求除的次数的期望。
设一个数的约数有M个,E[n] = (E[a[1]]+1)/M+(E[a[2]]+1)/M+...+(E[a[M]]+1)/M
一个数最大的约数是它自己。
则有,E[n] = (E[a[1]]+1)/M+(E[a[2]]+1)/M+...+(n+1)/M
(M-1)*E[n]=E[a[1]]+E[a[2]]+...+E[a[M-1]]+M
#include<stdio.h> #include<math.h> #define maxn 100010 double dp[maxn]; void Init() { dp[1]=0; for(int i=2;i<maxn;i++) { double sum=0; int cnt=0; for(int j=1;j<=sqrt(i*1.0);j++) if(i%j==0) { sum+=dp[j];cnt++; if(j!=i/j) { sum+=dp[i/j];cnt++; } } sum+=cnt; dp[i]=sum/(cnt-1); } } int main() { Init(); int T,n,cas=1; scanf("%d",&T); while(T--) { scanf("%d",&n); printf("Case %d: %lf ",cas++,dp[n]); } return 0; }