loj 1038

imi 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

网上的题解都是错的,结果一群人再抄,笑死我了

设一个数的约数有num个,E[n] = (E[a[1]]+1)/num+(E[a[2]]+1)/num+...+(E[a[num]]+1)/num  ,而a[num]==n,于是整理得:

E[n]=(E[a[1]]+E[a[2]]+...+E[a[num-1]]+num)/(num-1)。

网上这个式子多了个+1,一群人抄的很起劲,笑死我了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

int n;
double dp[111111];

void Get_Dp()
{
    dp[1]=0;
    for(int i=2;i<=100000;i++){
        int cnt=0;
        double sum=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];
                }
            }
        }
        dp[i]=(sum+cnt)/(cnt-1);
    }
}

int main()
{
    Get_Dp();
    int _case,t=1;
    scanf("%d",&_case);
    while(_case--){
        scanf("%d",&n);
        printf("Case %d: %.10f\n",t++,dp[n]);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/coolwx/p/11421599.html