[LightOJ1038] Race to 1 Again
传送门:>出错啦<
题意:给你一个整数n,每一次可以随机选择一个n的因子x(包括1和它自己),让n除以x——不停重复此过程,直到n==1. 问n被除到1的期望次数。
解题思路:
今天刚学的期望Dp,这道题就算入门啦,顺带总结一下期望Dp的做题方法。
一般的,我们可以设$f[i]$表示从状态i到目标状态的期望次数。因此我们可以先确定本题的目标状态——n变为1. 因此在本题中,我们可以设$f[i]$表示$n==i$时到$n==1$的期望次数。由于目标状态本身到目标状态是根本不用变的,因此先确定$f[1] = 1$
于是由于最小的已经确定了,我们可以从1开始推:由小的来确定大的。因此我们可以枚举i,再枚举i的所有因子。设i的因子为$a_1, a_2, ..., a_m$,则有:$$f[i] = \frac{f[a_1] + f[a_2] + ... + f[a_m]}{m} + 1$$
即f[i]可以通过除一次来得到所有的这些因子(是得到这些因子,并不是除掉,想一想为什么),因此$f[i]$变成1的期望就是它变成的所有这些因子的期望的平均值,再加上本次的这个1.
然而很快会发现,$a_m = i$,$f[i]$总不可能用自己来转移自己吧……因此我们需要对方程进行变形
一般处理期望这些问题的用得都是实数,所以可以当代数式来做:
两边同时乘以$m$,$$f[i] * m = f[a_1] + f[a_2] + ... + f[i] + m$$ $$f[i] * (m - 1) = f[a_1] + f[a_2] + ... + f[a_{m-1}] + m$$ $$f[i] = \frac{f[a_1] + f[a_2] + ... + f[a_{m-1}] + m}{m - 1}$$
Code
要注意的是,直接$O(n^2)$枚举会超时,所以我们可以$O(n\sqrt{n})$,再$O(\sqrt{n})$的时间内搞出所有因子——特判一下完全平方数即可
/*By QiXingzhi*/
#include <cstdio>
#include <cmath>
#include <queue>
#define r read()
#define Max(a,b) (((a)>(b)) ? (a) : (b))
#define Min(a,b) (((a)<(b)) ? (a) : (b))
using namespace std;
typedef long long ll;
const int INF = ;
inline int read(){
int x = ; int w = ; register int c = getchar();
while(c ^ '-' && (c < '' || c > '')) c = getchar();
if(c == '-') w = -, c = getchar();
while(c >= '' && c <= '') x = (x << ) +(x << ) + c - '', c = getchar();
return x * w;
}
int T,Case,N;
double f[];
inline void Solve(int N){
f[] = 0.0;
double m = 0.0, K = 0.0;
double flg = -1.0;
for(int i = ; i <= N; ++i){
K = 0.0;
m = 0.0;
flg = -1.0;
for(int j = ; j <= floor(sqrt(i)); ++j){
if(i % j == ){
m += 1.0;
K += f[j];
if(i % (i/j) == ){
m += 1.0;
K += f[i/j];
if(i/j == j){
flg = f[j];
}
}
}
}
if(flg != -1.0){
K -= flg;
m -= 1.0;
}
f[i] = (double)(K + m) / (double)(m - );
}
}
int main(){
Solve();
T = r;
while(T--){
N = r;
++Case;
printf("Case %d: %.8lf\n",Case, f[N]);
}
return ;
}
[LightOJ1038] Race to 1 Again的更多相关文章
- [算法]概率与期望DP
前言 前两节主要针对题目分析,没时间的珂以跳过. 初步 首先举一道简单.经典的好题: [Lightoj1038]Race to 1 Again 懒得单独写,安利一下DennyQi同学的博客:https ...
- LightOJ - 1038 Race to 1 Again —— 期望
题目链接:https://vjudge.net/problem/LightOJ-1038 1038 - Race to 1 Again PDF (English) Statistics Foru ...
- Promise.race
[Promise.race] 返回最先完成的promise var p1 = new Promise(function(resolve, reject) { setTimeout(resolve, 5 ...
- golang中的race检测
golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...
- 【BZOJ-2599】Race 点分治
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 2590 Solved: 769[Submit][Status ...
- hdu 4123 Bob’s Race 树的直径+rmq+尺取
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- Codeforces Round #131 (Div. 2) E. Relay Race dp
题目链接: http://codeforces.com/problemset/problem/214/E Relay Race time limit per test4 secondsmemory l ...
- 【多线程同步案例】Race Condition引起的性能问题
Race Condition(也叫做资源竞争),是多线程编程中比较头疼的问题.特别是Java多线程模型当中,经常会因为多个线程同时访问相同的共享数据,而造成数据的不一致性.为了解决这个问题,通常来说需 ...
- Codeforces Round #328 (Div. 2) C. The Big Race 数学.lcm
C. The Big Race Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/592/probl ...
随机推荐
- 腾讯发布新版前端组件框架 Omi,全面拥抱 Web Components
Omi - 合一 下一代 Web 框架,去万物糟粕,合精华为一 → https://github.com/Tencent/omi 特性 4KB 的代码尺寸,比小更小 顺势而为,顺从浏览器的发展和 AP ...
- 写了一个Windows API Viewer,提供VBA语句的导出功能。提供两万多个API的MSDN链接内容的本地查询
始出处:http://www.cnblogs.com/Charltsing/p/APIViewer.html QQ:564955427,QQ群:550672198 世面上的API Viewer已经不少 ...
- MySQL和Oracle的区别
由于SQL Server不常用,所以这里只针对MySQL数据库和Oracle数据库的区别 (1) 对事务的提交 MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写 ...
- socket流程
- 【kindle笔记】之 《鬼吹灯》-9-20
[kindle笔记]读书记录-总 9-20 日常吐槽 连着几天,基本是一口气读完了鬼吹灯. 想来,也算是阴差阳错了.本来是想看盗墓的,读了几页开头,心想坏了,拷贝错了,这是鬼吹灯-- 讲真的,每每读小 ...
- vmware can not be closed virtual machine is busy
VMware does not close when Windows Server 2003 ... |VMware Communities https://communities.vmware.co ...
- nodejs配置nginx 以后链接mongodb数据库
服务器 :windows server2008 R2 反向代理 :nginx 1.15.1 for window 64位 数据库:mongodb 4 64位 使用框架express 首先下载nodej ...
- 关于windows注册表
Windows 注册表 应该是一个 数据库.里面包含操作系统以及在其上的软件配置信息和旗下的硬件配置信息,有点就是整体和全面,控制面包和gpedit.msc 组策略应该是抽象过后的注册表配置信息, W ...
- jquery获取select多选框选中的值
select下拉框选中的值,用jquery大家应该都会获取, $("#selectBox option:selected").val(); 如果select是多选的,也这么获取的话 ...
- vue.js实战——vue 实时时间
created:实例创建完成后调用,此阶段完成了数据的观测等,但尚未挂载,$el还不可用,需要初始化处理一些数据时会比较有用. mounted:el挂载到实例上后调用,一般我们的第一个业务逻辑会在这里 ...