P5589 【小猪佩奇玩游戏】
这题还是比较妙妙套路的,复杂度为\(O(log^2N)\),可以卡掉\(\sqrt n\)的做法
首先我们可以把原数列分成很多个集合,集合之间肯定是两两独立的,考虑分别计算答案
我们定义\(f_i\)为集合大小为i出现过多少次(集合大小最多为\(logN\)级别),\(g_i\)表示集合大小为i删除完的期望步数
那么答案是可以表示成\(\sum_{i=1}^{log_N}{f_i*g_i}\)
现在考虑怎么求出\(f_i, g_i\)
你可能会好奇题目下方的提示有什么用,没错他就是给你求\(f_i\)用的
考虑集合大小至少为i出现了多少次,记之为\(p_i\),那么\(p_k=n^{\frac{1}{k}}\)
再考虑容斥,因为这个集合是有序集合,集合大小为\(a\)的集合出现在集合大小为\(b\)的集合中出现了\(\frac{b}{a}\)次
证明:假设一个集合开始元素是\(x\),那么\(x^{a*k}≤x^{b}\),即\(a*k≤b\),即\(k ≤ \frac{b}{a}\)
由于f集合大小不大,我们暴力算就行了,这里复杂度为\(O(log^2N)\)(可能可以套一个整除分块优化至\(O(logN*log \sqrt N)\),不太清楚怎么做)
然后考虑怎么就\(g_i\)(打表!)
对于每一个集合,我们只取他们的对数,于是问题就转化成给定一个排列,每次可以删除一个数及其倍数,求期望删除次数
发现对于每一个数,假设他的约数个数为\(d_i\),那么他是可能被\(d_i\)个数删除的
考虑递推求出\(g_i\),那么\(g_i=g_{i-1}+\frac{1}{d_i}\)(一个数会被\(d_i\)个数删完,只有\(\frac{1}{d_i}\)的概率需要多花费一次来删掉这个新加入的数)
那么我们就做完了,总体复杂度为\(O(log^2N)\)
\(Code:\)
#include<bits/stdc++.h>
using namespace std;
#define rep(i, s, t) for(int i = s; i <= t; ++ i)
#define drep(i, s, t) for(int i = t; i >= s; -- i)
#define maxn 100005
int p[maxn], f[maxn], n, m;
double g[maxn], ans;
bool check(int a, int b, int n) {
long long pax = a;
for(; b; b --, pax = pax * a) if(pax > 1ll * n) return 1;
return 0;
}
int get(int i, int n) {
int l = 1, r = n, ans = n;
while(l <= r) {
int mid = (l + r) >> 1;
if(check(mid, i, n)) r = mid - 1, ans = mid;
else l = mid + 1;
}
return ans - check(ans, i, n);
}
int d(int x) {
int ans = 1;
rep(i, 2, 30) {
if(x % i) continue;
int tot = 0;
while(x % i == 0) ++ tot, x /= i;
ans *= (tot + 1);
}
return ans;
}
void init() {
g[1] = 1.0;
rep(i, 2, 30) g[i] = g[i - 1] + 1.0 / d(i);
}
int main() {
init(), scanf("%d", &m);
while(m --) {
scanf("%d", &n), ans = 1, p[31] = 1;
rep(i, 1, 30) p[i] = get(i, n);
rep(i, 1, 30) f[i] = p[i] - p[i + 1];
drep(i, 1, 30) rep(j, 2, 30) f[i / j] -= f[i];
rep(i, 1, 30) ans += g[i] * f[i];
printf("%.10lf\n", ans);
}
return 0;
}
P5589 【小猪佩奇玩游戏】的更多相关文章
- 【题解】P5589 小猪佩奇玩游戏(期望)
[题解]P5589 小猪佩奇玩游戏(期望) 假设一个点有\(x\)个点(包括自己)可以到达他,他就对答案有\(1/x\)的贡献.这是因为这个点必须被删掉而通过删掉这个点本身删掉这个点的概率是\(1/x ...
- 原生JS实战:写了个一边玩游戏,一边记JS的API的游戏
本文是苏福的原创文章,转载请注明出处:苏福CNblog:http://www.cnblogs.com/susufufu/p/5878913.html 本程序[一边玩游戏,一边记JS的API]是本人的个 ...
- bzoj4730: Alice和Bob又在玩游戏
Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2 ...
- cdoj 1136 邱老师玩游戏 树形背包
邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1136 Desc ...
- win7系统玩游戏不能全屏的解决办法
1.修改注册表中的显示器的参数设置 Win键+R键,打开运行窗口,输入regedit回车,这样就打开了注册表编辑器,然后,定位到以下位置: HKEY_LOCAL_MACHINE\SYSTEM\ ...
- 【用PS3手柄在安卓设备上玩游戏系列】连接手柄和设备
背景 硬件要求1:PS3 手柄 + 手柄配套的USB线 硬件要求2:已经获得 ROOT 权限并且支持蓝牙的安卓设备 软件要求1:Sixaxis Compatibility Checker PS3 手柄 ...
- UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>
G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- 【特殊的图+DP】【11月校赛】大家一起玩游戏
大家一起玩游戏 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...
随机推荐
- 【SpringBoot】SpingBoot整合AOP
https://blog.csdn.net/lmb55/article/details/82470388 [SpringBoot]SpingBoot整合AOPhttps://blog.csdn.net ...
- Linux中使用MegaCli工具查看、管理Raid卡信息
MegaCli是一款管理维护硬件RAID软件,可以通过它来了解当前raid卡的所有信息,包括 raid卡的型号,raid的阵列类型,raid 上各磁盘状态,等等.通常,我们对硬盘当前的状态不太好确定, ...
- 16 doc values 【正排索引】
搜索的时候,要依靠倒排索引:排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序,所谓的正排索引,其实就是doc values 在建立索引的时候,一方面会建立倒排索引, ...
- virsh 添加虚拟交换机
virsh 添加虚拟交换机 来源 https://blog.csdn.net/a1987463004/article/details/90905981 vim /etc/libvirt/qemu/ne ...
- Ubuntu中使用sanp一键安装安装Notepad ++
很少有文本编辑器像Notepad ++一样流行得到广大用户的喜爱,Notepad ++是一个免费的开源代码编辑器,专为Windows构建,用C ++编写.以其小巧的应用程序大小和出色的性能而闻名,但缺 ...
- data:image/png;base64应用
原文:https://blog.csdn.net/deng_xj/article/details/93731850 data:image/png;base64应用 我们知道任何图片都可以通过base6 ...
- linux技能点七 shell
shell脚本:定义,连接符,输入输出流,消息重定向,命令的退出状态,申明变量,运算符,控制语句 定义:linux下的多命令操作文件 连接符: ::用于命令的分隔符,命令会从左往右依次执行 & ...
- 使用TP5验证器遇到的坑
项目中需要对字段进行验证,本人使用的是控制器验证方式.话不多说,直接上报错信息: SQLSTATE[42S02]: Base table or view not found: 1146 Table ' ...
- 部署GitLab时, 问题
1. 开启防火墙可能会对 nginx 造成影响. 2. 安装 gitlab 会自带一个 nginx, 启动后会对 现有的nginx 造成影响, 解决方案 参考 连接 1
- Docker搭建私用仓库
搭建私有仓库 # 1.查找registry,官方的私用仓库镜像 docker search registry # 2.下载私有仓库镜像 docker pull registry # 3.创建并后台运行 ...