LightOJ 1038 Race to 1 Again【概率DP】

来源:互联网 发布:视频加速软件 编辑:程序博客网 时间:2024/06/05 03:17

Race to 1 Again
Crawling in process...Crawling failedTime Limit:2000MS    Memory Limit:32768KB     64bit IO Format:%lld & %llu
Submit Status Practice LightOJ 1038 uDebug
Appoint description:

Description

Input

Output

Sample Input

Sample Output

Hint

Description

Rimi learned a new thing about integers, which is - any positive integer greater than1 can be divided by its divisors. So, he is now playing with this property. He selects a numberN. And he calls this D.

In each turn he randomly chooses a divisor of D (1 to D). Then he dividesD by the number to obtain new D. He repeats this procedure untilD becomes 1. What is the expected number of moves required forN 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 than10-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;}











0 0