引用自:http://hi.baidu.com/aekdycoin/item/be20a91bb6cc3213e3f986d3,有改动

题意:
已知D, 每次从[1,D] 内的所有素数中选择一个Ni, 如果D = 0(mod Ni), 那么D /= Ni,否则D不变(可以看成是每一轮 D/= GCD(D,Ni) )

思路:
概率DP
令 dp[ i ] 表示 D = i 的时候的期望, 即从i 转移到1 的次数期望. 我们有

p = kcnt[ i ] / cnt[ i ];

kcnt[ i ] 表示i 的素因子种类, cnt[ i ]表示[ 1..i ]内的素数总数, p 表示 D = i 时的D可以在一轮以后减小的概率, 而对于i 的每一种素因子, 取得他们的概率显然都为 1 / cnt[ i ]
假设Ni 是 i 的某个素因子.

fac[ k ]表示 i 的第 k 个质因子.
后半部分的求和表示从所有的子状态累加上来的期望.
前面则是考虑(1.0 - p)D不变化的情况.

得到kcnt[ ],cnt[ ],fac[ ]就可以得到dp[ ]
优化:
cnt[ ] 可以通过筛选素数以后累加得到
kcnt[ ] 也可以通过筛选素数类似的做法得到
fac[ ]显然也可以预处理得到
而由于处理fac[ i ]的时候需要分解得到 i 的素因子,这里我们继续做一个dpf, dpf[ i ]保存的是 i 的最小素因子, 这样就可以用类似于筛法的过程得到 i 的所有质因子

#include<cstdio>
using namespace std;
const int MAXN = 1000005;
const int MAXP = 100000;
bool ss[MAXN]= {1,1};///筛法求素的数组,前两位(0和1)先标记(没用)...标记代表被筛掉了
/*int p[MAXP],plen = 0;///p[i]表示第i个素数(好像没用)*/
int cnt[MAXN];///i以内素数个数
int kcnt[MAXN];///i的素因子种类数
int dpf[MAXN];///i的最小质因子
double dp[MAXN];///从i转移到1的期望
int fac[305],flen;
///求i的...
void process(int n)
{
int i;
int on = n;
flen = 0;
/*
while(n!=1&&dpf[n]!=n)///没有到分解完毕并且下一步也不会分解完毕
{
if(flen == 0 ||dpf[n]!=fac[flen -1])///如果相同,则不记录,只继续除.
fac[flen++] =dpf[n];///记录n的新的一种素因子(一个一个分解)
n/=dpf[n];///除去这个素因子
}
if(dpf[n] == n)///如果即将分解完毕
if(flen == 0 ||n!=fac[flen -1])///如果需要记录,则记录
fac[flen++] = n;
*/
while(n!=1)///没有分解完毕
{
if(flen == 0 ||dpf[n]!=fac[flen -1])///如果相同,则不记录,只继续除.
fac[flen++] =dpf[n];///记录n的新的一种素因子(一个一个分解)
n/=dpf[n];///除去这个素因子
}
n = on;
for(i=0; i<flen; ++i)dp[n] += (dp[n/fac[i]]+1.0) / cnt[n];///sigma
} void mklist()
{
int i,j;
dpf[1] = 0;
for(i=2; i<MAXN; ++i)
if(!ss[i])
for(j=i; j<MAXN; j+=i)
{
if(!ss[j])
dpf[j] =i;///dpf[j]记录着j的最小素因子
if(j!=i)
ss[j] = 1;///如果不是素数本身,就筛掉
}
cnt[0] = cnt[1] = 0;
for(i=2; i<MAXN; ++i)///数组筛好了之后
if(!ss[i])
/*p[plen++]=i,*/
cnt[i] = cnt[i-1]+1;
else
cnt[i] = cnt[i-1];
for(i=2; i<MAXN; ++i)
if(kcnt[i] == 0)///i为素数
for(j=i; j<MAXN; j+=i)
++kcnt[j];///像筛法一样求每个数的素因子种类数
dp[1] = 0.0;
for(i=2; i<MAXN; ++i)
{
double p = 1.0*kcnt[i]/cnt[i];///总的转移的概率
dp[i] = (1.0-p);///停留在原地的概率(公式整理得到)
process(i);///把分解质因子和dp过程合在了一起
dp[i] /= p;
}
} int main()
{
mklist();
int t;
int idx = 0,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
++idx;
printf("Case %d: ",idx);
printf("%.10lf\n",dp[n]);
}
return 0;
}

uva目前上不去...改日自己再交

[uva 11762]Race to 1[概率DP]的更多相关文章

  1. UVA 11762 - Race to 1(概率)

    UVA 11762 - Race to 1 题意:给定一个n,每次随即选择一个n以内的质数,假设不是质因子,就保持不变,假设是的话.就把n除掉该因子,问n变成1的次数的期望值 思路:tot为总的质数. ...

  2. UVA - 11762 - Race to 1 记忆化概率

    Dilu have learned a new thing about integers, which is - any positive integer greater than 1 can bed ...

  3. UVa 1637 - Double Patience(概率DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVa 11762 - Race to 1

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. UVA - 11427 Expect the Expected (概率dp)

    Some mathematical background. This problem asks you to compute the expected value of a random variab ...

  6. UVa 11468 Substring (AC自动机+概率DP)

    题意:给出一个字母表以及每个字母出现的概率.再给出一些模板串S.从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机, ...

  7. UVA 11600 Masud Rana(概率dp)

    当两个城市之间有安全的道路的时候,他们是互相可到达的,这种关系满足自反.对称和传递性, 因此是一个等价关系,在图论中就对应一个连通块. 在一个连通块中,当前点是那个并不影响往其他连通块的点连边,因此只 ...

  8. Uva 10081 Tight words (概率DP)

    Time limit: 3.000 seconds Given is an alphabet {0, 1, ... , k}, 0 <= k <= 9 . We say that a wo ...

  9. UVA 11762 Race to 1(记忆化+期望)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20869 [思路] DP+期望. 设f[x]表示从x转移到1的期望操 ...

随机推荐

  1. 浅谈SpringMVC(一)

    一.SpringMVC引言 Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MV ...

  2. 【转载】谈谈Cookie

    0×00 引言 在Web技术的发展史上,Cookie技术的出现是一次重大的 变革.但是, Cookie技术又是一项非常有争议的技术,从它诞生之日起就成了广大网络用户和Web开发人员的一个争论焦点,原因 ...

  3. [C#参考]UI和线程(一)

    Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程. 什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包 ...

  4. leetcode Palindrome Number python

    class Solution(object): def isPalindrome(self, x): """ :type x: int :rtype: bool &quo ...

  5. [翻译]如何用YII写出安全的WEB应用

    前言 虽然本文是基于YII1.1,但其中提到的安全措施适用于多数web项目安全场景,所以翻译此文,跟大家交流.原文地址. 目录 安全基本措施... 2 验证与过滤用户的输入信息... 2 原理... ...

  6. Eclipse+EGit的配置注意点, 以及解决Github多个本地仓库之间的冲突

    问题描述 不同本地仓库(e.g. Repo1, Repo2)之间同时修改一个文件时, 出现文件无法merge的情况. 具体表现为, 冲突(红色双向实心箭头)一直存在, 点pull没反应, 点push报 ...

  7. 常用Android快速开发框架

    在做项目的过程中遇到了很多困难,于是收集了一些快速开发的框架,使用后大大提高了项目开发速度,无论什么项目都可以使用的到,在此分享给大家,希望能对大家有帮助!(个人建议:有时间的同学可以看一下这些优秀框 ...

  8. ODI学习笔记2--ODI产品架构

    ODI学习笔记2--ODI产品架构 ODI产品架构: ODI提供了以下几种管理工具:Designer 用于定义数据转换逻辑,这是最常用的开发工具,大部分的开发任务,包括data store的定义,in ...

  9. HDU 3507 Print Article(CDQ分治+分治DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3507 [题目大意] 将长度为n的数列分段,最小化每段和的平方和. [题解] 根据题目很容易得到dp ...

  10. Android项目开发五-《星星生活志》1.使用MediaRecorder录制音频

    Android设备实现录制音频的简单demo 转载请注明; http://blog.csdn.net/u013670933/article/details/26089487 代码例如以下: publi ...