题目描述:
给出一个数D,每次可以选择数D的一个因子,用数D除上这个因子得到一个新的数D,为数D变为1的操作次数的期望为多少?
解题思路:
根据期望的定理:从当前位置移动到目的地的平均步数。所以可得到:E50 = (E1+1)/6 + (E2+1)/6 + (E5+1)/6 + (E10+1)/6 + (E25+1)/6 + (E50+1)/6;
E1 == 0,然后先后依次递推就好啦。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
double dp[105];
double dfs(int now)
{
if(now==1) return 0;
double temp=0,sum=2;
for(int i=2;i*i<=now;i++)
if(now%i==0&&now/i!=i) sum+=2;
else if(now%i==0) sum+=1;
for(int i=2;i*i<=now;i++)
if(now%i==0&&now/i!=i) temp+=(dfs(i)+dfs(now/i))/sum;
else if(now%i==0) temp+=dfs(i)/sum;
return sum/(sum-1.0)*(temp+1);
}
int main()
{
int t,n,s=0;
cin>>t;
while(t--)
{
cin>>n;
cout<<"Case "<<++s<<": ";
cout<<fixed<<setprecision(7)<<dfs(n)<<endl;
}
}