引用自: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. Oracle包的概念

    转自:http://www.cnblogs.com/lovemoon714/archive/2012/02/29/2373695.html 1.为什么要使用包?       答: 在一个大型项目中,可 ...

  2. TinyFox 部署在CentOS7 中测试使用

    一:TinyFox介绍 TinyFox 是一款支持OWIN标准的WEB应用的高性能的HTTP服务器,是Jexus Web Server的"姊妹篇".TinyFox本身的功能是htm ...

  3. css区分ie6,7,ff

    IE6能识别*,但不能识别 !important,IE7能识别*,也能识别!important;FF不能识别*,但能识别!important; 可以这样区别FF,IE7,IE6: background ...

  4. Spring集成Quartz定时器

    <!-- Spring集成Quartz开始 --> <bean id="startQuertz" lazy-init="false" auto ...

  5. 理解angular中的module和injector,即依赖注入

    理解angular中的module和injector,即依赖注入 依赖注入(DI)的好处不再赘言,使用过spring框架的都知道.angularjs作为前台js框架,也提供了对DI的支持,这是java ...

  6. JWPlayer 初探

    http://www.360doc.com/content/13/0103/22/21412_258041878.shtml JWPlayer 是一款比较实用的web flash 播放器

  7. linux系统巡检脚本shell实例

    #!/bin/sh BACKUP_TIMESTAMP=`date +%Y%m%d` HOSTNAME=`hostname` num=89 ###################核查文件系统opt### ...

  8. cocos2dx CCEditBox

    CCTextFieldTTF是一个简单的封装,用起来不是那么便利,在cocos2dx的extension里,对输入框有更加简单使用的类,那就是CCEditBox 上代码先: bool EditBox0 ...

  9. orcale装完sqldevelop启动不了

    一直在搞考试,昨天考java企业级开发要交项目搞得我装系统后又装了个orcale,每次重新配百度太麻烦,还好记得点,记录下碰到的错误 64位的系统下的orcale11 64位里面的sqldevelop ...

  10. AspectJ给类的属性打桩,进行替换。

    这个东西必须写个博客记一下了,一方面是防止以后忘记,一方面也反思一下自己的固执. 在我们的代码中,通常会有一些配置文件的路径写死在代码里面.比如 public class ConfigPath { p ...