Description
Input
Output
Sample Input
Sample Output
Hint
Description
Rimi learned a new thing about integers, which is - any positive integer greater than 1 can be divided by its divisors. So, he is now playing with this property. He selects a number N. And he calls this D.
In each turn he randomly chooses a divisor of D (1 to D). Then he divides D by the number to obtain new D. He repeats this procedure until D becomes 1. What is the expected number of moves required for N to become 1.
Input
Input starts with an integer T (≤ 10000), denoting the number of test cases.
Each case begins with an integer N (1 ≤ N ≤ 105).
Output
For each case of input you have to print the case number and the expected value. Errors less than 10-6 will be ignored.
Sample Input
3
1
2
50
Sample Output
Case 1: 0
Case 2: 2.00
Case 3: 3.0333333333
/*
题意:求将一个数变成1,每次可以除去它的任意一个因子,问你次数的期望为多少
类型:概率DP
分析:设dp[i]表示i变成1的次数期望
当N=2时,有两个因子:1,2.所以dp[2]=dp[1]/2+dp[2]/2+1; 可以得到dp[2]=2;
当N=8时,有4个因子1,2,4,8.所以dp[8]=dp[1]/4+dp[2]/4+dp[4]/4+dp[8]/4+1;可以得到dp[8];
以此类推 dp[i]=dp[a[1]]/cnt+dp[a[2]]/cnt+...+dp[a[cnt]]/cnt+1;
其中cnt为i的因子个数,a数组为i的因子集合
整理可得dp[i]=(dp[a[1]]+dp[a[2]]+...+dp[a[cnt-1]]+cnt)/(cnt-1);
*/
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 100005;
double dp[maxn];
int main()
{
dp[1] = 0;
for(int i=2;i<maxn;i++){
double sum=0;
int cnt=0;
for(int j=1;j*j<=i;j++){
if(i%j==0){
cnt++;
sum+=dp[j];
if(j*j!=i){
cnt++;
sum+=dp[i/j];
}
}
}
sum+=cnt;
dp[i]=sum/(cnt-1);
}
int t,n;
scanf("%d",&t);
for(int Cas=1;Cas<=t;Cas++){
scanf("%d",&n);
printf("Case %d: %.6f\n",Cas,dp[n]);
}
return 0;
}