LightOJ 1038 Race to 1 Again expectation of memorizing dp
Question link: Click the open link
1038-Race to 1 Again
|
PDF (English) |
Statistics |
Forum |
Time Limit: 2 second (s) |
Memory Limit: 32 MB |
Rimi learned a new thing about integers, which is-any positive integer greater1Can be divided by its divisors. So, he is now playing with this property. He selects a numberN. And he callthisD.
In each turn he randomly chooses a divisorD (1 to D). Then he dividesDBy the number to obtain newD. He repeats this procedureDBecomes1. What is the expected number of moves requiredNTo become1.
Input
Input starts with an integerT (≤ 10000), Denoting the number of test cases.
Each case begins with an integerN (1 ≤ N ≤ 105).
Output
For each case of input you have to print the case number and the expected value. Errors less10-6Will be ignored.
Sample Input |
Output for Sample Input |
3 1 2 50 |
Case 1: 0 Case 2: 2.00 Case 3: 3.0333333333 |
After the equation is written, it is found that dp [n] = *** + dp [n] * C,
Moving dp [n] to one side is a common recursive formula.
#include
#include#include
#include
using namespace std;#define N 100005double dp[N];int main(){ dp[1] = 0; dp[2] = 2; for(int i = 3; i < N; i++) { dp[i] = 0; int tmp = 0; for(int j = 1; j*j <= i; j++) { if(i % j == 0) { dp[i] += dp[j]; tmp++; if(j != i/j && i/j != i) { dp[i] += dp[i/j]; tmp++; } } } dp[i] = ( dp[i] + tmp+1)/tmp; } int n, Cas=1, T, i; scanf("%d",&T); while(T--) { scanf("%d", &n); printf("Case %d: %.10f\n", Cas++, dp[n]); } return 0;}