給一個數字,等概率選擇一個這個數字的除數,然後將這個數字除以這個除數,直到這個數字等於1,求這個數字等於1的期望次數。
我們用 表示這個數字的期望次數,對於每一個數字 i ,有
,化簡後得
所以枚舉每一個數字,暴力跑一下他的因數
#include <bits/stdc++.h>
#define ll long long
#define sc scanf
#define pr printf
using namespace std;
double dp[100005];
void init()
{
for (int i = 2; i <= 100000; i++)
{
int cnt = 0;
dp[i] += dp[1];
cnt += 2;
for (int j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
dp[i] += dp[j];
cnt++;
if (j != i / j)
{
dp[i] += dp[i / j];
cnt++;
}
}
}
dp[i] = (dp[i] + cnt) / (cnt - 1);
}
}
int main()
{
init();
int T, cas = 1;
sc("%d", &T);
while (T--)
{
int n;
sc("%d", &n);
printf("Case %d: %.9lf\n", cas++, dp[n]);
}
}