题目链接
http://www.lightoj.com/volume_showproblem.php?problem=1038
题目大意
对于一个数字D, D可以通过不停的除以自身因子(包括1和自身)使自己变得更小,最后为1。现在求一个数最后变为1需要花费次数的期望。
代码如下
#include<bits/stdc++.h>
using namespace std;
double dp[100007];
int arr[100007];
void solve(int cases)
{
int n;
scanf("%d", &n);
printf("Case %d: %.8f\n", cases, dp[n]);
}
void init()
{
memset(dp, 0, sizeof(dp));
memset(arr, 0, sizeof(arr));
for(int i=1; i<=100000; ++ i)
{
if(i != 1)
dp[i] = (dp[i] + arr[i] + 1) / arr[i];
for(int j=i*2; j<=100000; j+=i)
{
arr[j] ++;
dp[j] += dp[i];
}
}
}
int main()
{
init();
int t;
scanf("%d", &t);
for(int i=1; i<=t; ++ i)
solve(i);
return 0;
}