[uva 11762]Race to 1[概率DP]
引用自: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]的更多相关文章
- UVA 11762 - Race to 1(概率)
UVA 11762 - Race to 1 题意:给定一个n,每次随即选择一个n以内的质数,假设不是质因子,就保持不变,假设是的话.就把n除掉该因子,问n变成1的次数的期望值 思路:tot为总的质数. ...
- UVA - 11762 - Race to 1 记忆化概率
Dilu have learned a new thing about integers, which is - any positive integer greater than 1 can bed ...
- UVa 1637 - Double Patience(概率DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 11762 - Race to 1
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVA - 11427 Expect the Expected (概率dp)
Some mathematical background. This problem asks you to compute the expected value of a random variab ...
- UVa 11468 Substring (AC自动机+概率DP)
题意:给出一个字母表以及每个字母出现的概率.再给出一些模板串S.从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机, ...
- UVA 11600 Masud Rana(概率dp)
当两个城市之间有安全的道路的时候,他们是互相可到达的,这种关系满足自反.对称和传递性, 因此是一个等价关系,在图论中就对应一个连通块. 在一个连通块中,当前点是那个并不影响往其他连通块的点连边,因此只 ...
- 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 ...
- UVA 11762 Race to 1(记忆化+期望)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20869 [思路] DP+期望. 设f[x]表示从x转移到1的期望操 ...
随机推荐
- 几个SQL
select sum(`value`) from testtable where value != 'error' AND type ='b' in (select DISTINCT(type) fr ...
- A - 数塔
A - 数塔 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- Spring——自定义属性编辑器+Bean的生存范围+Bean的生命周期
一.自定义属性编辑器(一个类): 步骤: 1.写一个类,这个类继承PropertyEditorSupport. 2.重写setAsText()方法. 3.在bean.xml文件中添加属性编辑器的bea ...
- Responsive Design响应式网站设计心得笔记
这个词已经喊了很久了,一直都是小打小闹,没正经的做过大的响应式全站,这次终于有机会了.网站刚上线半个月,就要改版为响应式设计,支持手机/PC等各类终端显示浏览.今天把首页做好,并测试无误,这里把一些应 ...
- Toast的替代者Snackbar
在Android design support library中,SnackBar的使用: Part 2 – Welcome Snackbar, Goodbye Toast! BY PARESH MA ...
- codeforces 463C Gargari and Bishops
题目链接 这个题, 最主要的应该是找到对角线上的格子的关系. “ \" 这种对角线, 关系是x-y+n相等, ” / “ 这种, 关系是x+y相等.知道每个格子的两种对角线的值, 那么这个格 ...
- oracle 数据库数据迁移解决方案
大部分系统由于平台和版本的原因,做的是逻辑迁移,少部分做的是物理迁移,接下来把心得与大家分享一下 去年年底做了不少系统的数据迁移,大部分系统由于平台和版本的原因,做的是逻辑迁移,少部分做的是物理迁 ...
- cpan安装及其使用
cpan安装及其使用 Perl是一种相当灵活的程序编程语言,现有的许有程序都是使用它进行编程的.它的优点之一就是无需自己编写编码,你就能利用许多增加的模块,创建新的功能. 程序利用这些模块的编码,而程 ...
- uva-699 Not so Mobile (杠杆,巧妙递归)
Not so Mobile Before being an ubiquous communications gadget, a mobile was just a structure made ...
- Oh, my goddess(bfs)
Oh, my goddess 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Shining Knight is the embodiment of justice ...