题意:http://www.lightoj.com/volume_showproblem.php?problem=1038
题意:给一个数,用这个数的因数除以这个数,直到为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+...+(E[n]+1)/M
(M-1)*E[n]=E[a[1]]+E[a[2]]+...+E[a[M-1]]+M
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<vector> #include<math.h> #include<string> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define N 100006 #define Lson rood<<1 #define Rson rood<<1|1 double dp[N]; void Q() { dp[1]=0; for(int i=2;i<N;i++) { double sum=0; int ans=-1; for(int j=1;j<=sqrt(i);j++) { if(i%j==0) { sum+=dp[j];ans++; if(j!=i/j) { sum+=dp[i/j];ans++; } } } sum+=ans+1; dp[i]=sum/ans; } } int main() { Q(); int T,t=1,n; scanf("%d",&T); while(T--) { scanf("%d",&n); printf("Case %d: %.10f\n",t++,dp[n]); } return 0; }
时间: 2024-11-08 20:53:56