AGC032F One Third
很奇怪的一个题。看见了无从下手。概率期望好题。
给一个面积为 \(1\) 的圆,经过圆心随机幅角切直径 \(n\) 次,定义 \(f(x) = \min |S - \frac{1}{3}|\),其中 \(S\) 是连续块面积。求 \(f(x)\) 期望。
目前见到了两种做法。
首先开始的转化都是一样的。
因为答案是连续段,只和选出两个向量有关。考虑计算答案的式子(其中面积模 \(1\)):
\]
\(\pm\) 也就是对于两个互补的块都算一遍。于是过直径的切口可以直接当做一个从圆心出发的向量。类似复平面的单位向量。
我们把后面的 \(-y \pm \frac{1}{3}\) 提出来,也就是将 \(y\) 乘上个三次单位根的幂。
所以不如把每个向量变为 \(\left\{v, v \times \omega_3^1,v \times \omega_3^2\right\}\),然后求 \(x - y\) 幅角模 \(\frac{4\pi}{3}\) 最小值。
显然会出问题,因为当乘的单位根相同的时候,答案就假了,变为原式中 \(|x - y|\),但是单位根不同时都是行的,所以我们把扩展出的向量染色。
例如,\(\left[v, v \times \omega_3^1,v \times \omega_3^2\right]\),分别对应 \(\left[\texttt{red}, \texttt{green}, \texttt{blue}\right]\)(RGB)。
那么问题转化为求异色幅角差最小值。
显然答案小于 \(\frac{1}{3}\),且异色向量对之间不会有其他向量(即贪心地只取相邻的贡献到答案上)
显然如果选定一个向量为基准,它将单位圆分成的三个部分可以通过一个颜色的置换互相得到,所以只要算 \(\left[0, \frac{1}{3}\right)\) 即可。
问题变为,左端为红色,右端为绿色,长度为 \(\frac{1}{3}\),中间撒任意颜色 \(n - 1\) 个点,\(n\) 个异色段中长度差最小值期望。
首先来一个结论:
长度为 \(1\),分成 \(n\) 段,那么长度最小值的期望为 \(\frac{1}{n^2}\)。
简单证明一下。
考虑计算 \(P\left(\min = x\right) x\) 的积分,即 \(P\left(\min \geq x \right)\) 的积分。(前面那个我不会算 \(P\),我算出来都是错的 QAQ)
考虑 \(P\left(\min \geq x \right)\), 我们将每一段丢掉 \(x\),剩下随便选,那么 \(P\left(\min \geq x \right) = \left( 1 - nx \right) ^ {n-1}\)
积分一下即可证明。
下面有两个方法
直接上组合方法
容易求出 \(k\) 个异色段的最小值期望: \(\frac{1}{3} \times \frac{k}{n} \times \frac{1}{k^2} = \frac{1}{3nk}\)
那么只要求出 \(k\) 个异色段的概率即可。
我们只要 DP 出有 \(k\) 个异色段,第一个颜色为红最后一个颜色为绿的概率。直接 \(dp\) 起来有点慢,可以直接组合数枚举哪些地方颜色发生了变化,所以可以直接 DP 相邻两个颜色都不同的概率即可。只要枚举下一个颜色是什么, \(O\left(n\right)\) 完成计算。
显然答案可以通过枚举 \(k\),算期望乘以概率的和得到。
概率方法
考虑将得到的线段长度由小到大排序,如果最小的异色段是第 \(k\) 小,那么前面 \(k - 1\) 个都是同色的。
扩展一下上面的结论,我们枚举第 \(k\) 小。现在要得到第 \(k\) 小的长度期望。同样考虑丢掉一段,可得递推式:
\]
通过手算前几项,加上猜测以及归纳,可以得到
\]
现在要算 \(P\left( \min = k \right)\),但是乘上这个 \(E_k\) 式子有点不优美。
所以改成算 \(P\left( \min \geq k \right)\),然后对 \(\min \geq k\) 贡献上去 \(\frac{1}{n} \times \frac{1}{n - k + 1}\)。
显然这样求和答案不变。而且 \(P\left( \min \geq k \right)\) 也十分好算。因为至少有 \(k - 1\) 个段是相同的。虽然看起来有很多首尾相接的线段,使得概率互相关联使得算这个看起来很毒瘤,但是冷静思考可以发现,对于首尾拼接的 \(L\) 个段,它 \(L+ 1\) 个点全部同色的概率为 \(\left(\frac{1}{3}\right)^{L}\),因为最左端的点不论是否确定对答案都没影响。
废话了那么多,其实就是 \(P\left( \min \geq k \right) = \left(\frac{1}{3}\right)^{k - 1}\)
那么答案就是
E & = \frac{1}{3} \sum_{i=1}^{n} P(i) E_i \\
& = \frac{1}{n} \sum_{i=1}^{n} \frac{1}{3^{i} \left(n - i + 1\right)}
\end{align*}
\]
显然可以 \(O\left(n\right)\) 计算。
代码很简单,很不错的一道题。可以推广到 \(\frac{1}{k}\)
#include <bits/stdc++.h>
const int mod = 1000000007;
const int inv3 = (mod + 1) / 3;
typedef long long LL;
void reduce(int & x) { x += x >> 31 & mod; }
int mul(int a, int b) { return (LL) a * b % mod; }
int fastpow(int a, int b, int res = 1) {
for (; b; b >>= 1, a = mul(a, a)) if (b & 1) res = mul(res, a);
return res;
}
const int MAXN = 1000010;
int inv[MAXN], n;
int main() {
std::ios_base::sync_with_stdio(false), std::cin.tie(0);
std::cin >> n;
*inv = inv[1] = 1;
for (int i = 2; i <= n; ++i)
inv[i] = mul(inv[mod % i], mod - mod / i);
int ans = 0, now = 1;
for (int i = 1; i <= n; ++i) {
now = mul(now, inv3);
reduce(ans += mul(inv[n - i + 1], now) - mod);
}
std::cout << fastpow(n, mod - 2, ans) << '\n';
return 0;
}
如果式子有错误请留言
AGC032F One Third的更多相关文章
- ZJOI2019Round#2
乱听课记录 关于树的分治问题&杂题选讲 张哲宇 边分治 (边分不是很鸡肋吗) 例题一 题目大意:给出两颗有正负边权的树,求出两个点\(u,v\)使得两棵树中\((u,v)\)距离的和最大. ...
随机推荐
- 一块40克的砝码,摔成4块,利用天平,刚好可以称出1~40g所有整数克,问:这4块分别是多少克
public static void main(String[] args) { List<Integer> list = new ArrayList<>();//记录每组数的 ...
- Spring Boot:上传文件大小超限制如何捕获 MaxUploadSizeExceededException 异常
Spring Boot 默认上传文件大小限制是 1MB,默认单次请求大小是 10MB,超出大小会跑出 MaxUploadSizeExceededException 异常 spring.servlet. ...
- Win10环境下,告别MarkdownPad,用Notepad++搭建编写md文档的环境
1. 为什么抛弃MarkdownPad 2 ? MarkdownPad坊间号称 Windows 环境下最好用的markdown编辑器-EXO me??? 博主入MarkdownPad 2 坑就是因为这 ...
- cmd设置电脑自动关机
cmd设置电脑自动关机 设置:(3600代表一小时,单位s) shutdown -s -t 3600 取消 shutdown -a
- 使用css让表头固定的方法
1.可以使用display: table; width: 100%; table-layout: fixed; table-layout: fixed;设置表格布局算法.tableLayout 属性用 ...
- JSP 内置对象的说明
1 page:指的是当前的JSP页面本身,它是java.lang.object类的对象 2 config对象:它是ServletConfig类的一个实例 3 exception对象:它是java.la ...
- Asp .Net Core 2.0 登录授权以及前后台多用户登录
用户登录是一个非常常见的应用场景 .net core 2.0 的登录方式发生了点变化,应该是属于是良性的变化,变得更方便,更容易扩展. 配置 打开项目中的Startup.cs文件,找到Configur ...
- 忘记root密码,修改方法
Linux的root密码修改不像Windows的密码修改找回,Windows的登录密码忘记需要介入工具进行解决.CentOS6和CentOS7的密码方法也是不一样的,具体如下: 首先是CentOS 6 ...
- JAVA栅栏和闭锁的区别
闭锁:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.即,一组线程等待某一事件发生,事件没有发生前,所有线程将阻塞等待:而事件发生后,所有线程将开始执行:闭锁最初 ...
- 2019年C题 视觉情报信息分析
2019 年第十六届中国研究生数学建模竞赛C 题 任务1中 图三:图3 中拍照者距离地面的高度 目录: 0.试题分析: 1.构建摄像机模型 2.摄像机参数假定 3.像平面坐标计算 4.图像标定及数值测 ...