题目链接:https://vjudge.net/contest/299639#problem/C
题目大意:
给个数字D,我们可以选择[1,D]中可以被D整除的因子,除以D得到一个新的D,再用新D除以它的因子得到又一个新D,按次操作除到D=1时结束,求除的次数的期望值。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
vector<int> s[100005];
double dp[100005];
double dfs(int n)
{
if(n==1)
{
return 0;
}
if(dp[n])
{
return dp[n];
}
double ans=0;
for(auto &i:s[n])
{
if(i!=n)
{
ans+=dfs(i);
}
}
return dp[n]=(ans+s[n].size())/(s[n].size()-1);
}
int main()
{
int t, CUT=0;
scanf("%d",&t);
for(int i=1;i<=100000;i++)
{
for(int j=1;j<=sqrt(i);j++)
{
if(i%j==0)
{
s[i].push_back(j);
if(j!=i/j)
{
s[i].push_back(i/j);
}
}
}
}
while(t--)
{
CUT++;
int n;
for(int i=1;i<=n;i++)
{
dp[i]=0;
}
scanf("%d",&n);
printf("Case %d: %.7f\n",CUT,dfs(n));
}
return 0;
}