您的位置:首页 > 其它

UVA 11762 Race To 1 [期望DP]

2012-10-30 01:25 507 查看
  给一个数N,每步随机选一个不大于N的质数X,若X整除N,则N=N/X,否则N不变。求N变为1的期望步数。

  常规的期望DP,先预处理不大于N的质数个数以及N的质因数,d
=p0*d
+p1*d[n/d1]+p1*d[n/d2]...+1,其中d1,d2..是n的质因数,p0为选中一个质数不为n的质因数的概率,移项即可得到d
的表达式。

  

#include <string.h>
#include <stdio.h>
#include <vector>
#define MAXN 1000005
using namespace std;
int cas, n;
int pri[MAXN], totp[MAXN];
double d[MAXN];
vector<int> vec[MAXN];
void init(){
pri[1] = 1;
for (int i = 2; i < MAXN; i++) if (!pri[i]){
vec[i].push_back(i);
for (int j = i*2; j < MAXN; j += i)
pri[j] = 1, vec[j].push_back(i);
}
for (int i = 1; i < MAXN; i++)
totp[i] = totp[i-1] + (pri[i]==0);
memset(d, 0, sizeof d);
}
double dp(int n) {
if (n == 1) return 0;
if (d
!= 0) return d
;
double tt = 0;
for (int i = 0; i < vec
.size(); i++)
tt += dp(n/vec
[i])/totp
;
return d
= (tt + 1) / (vec
.size()*1.0/totp
);
}
int main(){
//freopen("test.in","r",stdin);
scanf("%d", &cas);
init();
for (int ca = 1; ca <= cas; ca++) {
scanf("%d", &n);
printf("Case %d: %.10f\n", ca, dp(n));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: