引用自: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. 红豆带你从零学C#系列之:初识继承与多态

    继承 现实生活当中,人类又可以根据职业分为:教师,学生,理发师,售货员 又比如飞机又有种类之分:直升飞机.客机.货机.战斗机等 在程序里面我们可能会通过创建类来描述这样的事物,比如学生类.教师类.理发 ...

  2. 使用 UML 进行业务建模:理解业务用例与系统用例的相似和不同之处

    使用 UML 进行业务建模:理解业务用例与系统用例的相似和不同之处   作者:Arthur V. English 出处:IBM   本文内容包括: 背景 业务用例模型与系统用例模型有什么相似之处? 业 ...

  3. atan(正切函数)

    atan函数:返回数值的余切值 原型:double atan(double x) <pre name="code" class="cpp">#inc ...

  4. tag标签添加删除并把值存入到一个input的value内

    html: <input type="text" id="tagValue" style="display: none;" /> ...

  5. 个人收集资料整理-WinForm

    [2016-03-23 20:29:56] 别人收集常用: http://www.cnblogs.com/babycool/p/3541192.html

  6. MySQL 数据显示宽度

    例子: 把int 的显示宽度设置为 3 create table t(x int(3) zerofill); insert into t(x) values(1); select x from t; ...

  7. java中三种常见内存溢出错误的处理方法

    更多 10   相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的 ...

  8. Snort

    https://www.snort.org/ http://blog.csdn.net/htttw/article/details/7521053 http://www.ibm.com/develop ...

  9. delete了,析构函数却没有调用

    析构函数在对象的生命结束时,会自动调用,大家所熟知的智能指针就是根据析构函数的这种特性而实现的,包括Qt的内存管理机制,也都是利用了析构函数的这一机制来实现的.c++创始人Bjarne Stroust ...

  10. http://www.swoole.com/

    Swoole:重新定义PHP PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器, ...