LIghtOJ1038 --- Race to 1 Again (probability dp)
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 callthis 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
Output for Sample Input
3
1
2
50
Case 1: 0
Case 2: 2.00
Case 3: 3.0333333333
Problem Setter: Jane Alam Jan
Dp [I] indicates the expected number of times I is converted to 1.
/*************************************** * *********************************> File Name: c. cpp> Author: ALex> Mail: zchao1995@gmail.com> Created Time: on Wednesday 19, April 29, 2015 ******************************** **************************************** /# include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
# Include
Using namespace std; const double pi = acos (-1.0); const int inf = 0x3f3f3f; const double eps = 1e-15; typedef long LL; typedef pair
PLL; double dp [100110]; double dfs (int num) {if (dp [num]! =-1) {return dp [num];} int cnt = 2; double ans = 0; for (int I = 2; I * I <= num; ++ I) {if (num % I = 0) {++ cnt; ans + = dfs (num/I); if (num/I! = I) {ans + = dfs (I); ++ cnt ;}} ans + = cnt; ans/= (cnt-1 ); return dp [num] = ans;} int main () {int t; scanf ("% d", & t); int icase = 1; while (t --) {int n; scanf ("% d", & n); for (int I = 1; I <= n; ++ I) {dp [I] =-1;} dp [1] = 0; printf ("Case % d: %. 12f \ n ", icase ++, dfs (n);} return 0 ;}