Light oj 1038 Race to 1 Again(概率dp)

1038 – Race to 1 Again

Time Limit:2 second(s)Memory Limit:32 MB

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

In each turn he randomly chooses a divisor ofD(1 to D). Then he dividesDby the number to obtain newD. He repeats this procedure untilDbecomes1. What is the expected number of moves required forNto 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 less than10-6will be ignored.

Sample InputOutput for Sample Input

3

1

2

50

Case 1: 0

Case 2: 2.00

Case 3: 3.0333333333

PROBLEM SETTER: JANE ALAM JAN

设x有n个因子,dp[x] =(dp[i]+dp[j]+….+dp[k])*(1/n)+dp[n]*1/n+1; (i,j,k表示x的因子)

换一下就可以得到dp[x]的表达式了,

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<stack>#include<vector>#include<set>#include<map>#define L(x) (x<<1)#define R(x) (x<<1|1)#define MID(x,y) ((x+y)>>1)#define eps 1e-8//typedef __int64 ll;#define fre(i,a,b) for(i = a; i <b; i++)#define free(i,b,a) for(i = b; i >= a;i–)#define mem(t, v) memset ((t) , v, sizeof(t))#define ssf(n)scanf("%s", n)#define sf(n)scanf("%d", &n)#define sff(a,b) scanf("%d %d", &a, &b)#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)#define pfprintf#define bugpf("Hi\n")using namespace std;#define INF 0x3f3f3f3f#define N 100005double dp[N];int n;void inint(){int i,j,cnt;double temp;dp[1]=0;mem(dp,0);fre(i,2,N) {cnt=0;temp=0; for(j=1;j*j<=i;j++)if(i%j==0){cnt++;temp+=dp[j];if(j*j!=i) {temp+=dp[i/j];cnt++; }}dp[i]=(temp+cnt)/(cnt-1); }}int main(){int i,j,t,ca=0;sf(t);inint();while(t–){sf(n);pf("Case %d: %.6lf\n",++ca,dp[n]);} return 0;}

,打掉的应是脆弱的铁屑,锻成的将是锋利的钢刀。

Light oj 1038 Race to 1 Again(概率dp)

相关文章:

你感兴趣的文章:

标签云: