题目描述

给定在笛卡尔坐标系的单位圆上的\(N\)个点(圆心为\((0, 0)\))。第\(i\)个点的坐标为\((cos(\frac{2 \pi T_i}{L}), sin(\frac{2 \pi T_i}{L}))\)。

三个不同的点将在这\(N\)个点中等概率的随机,请求出这三个点构成的三角形的内切圆圆心的\(x\)坐标的数学期望和\(y\)坐标的数学期望。

约束条件

\(3 \leq N \leq 3000\)

\(N \leq L \leq 10^9\)

\(0 \leq T_i \leq L - 1\)

\(T_i < T_{i+1}\)

所有的输入的数都是整数。

测试点时间限制:4s

测试点空间限制:1024MB

题目解答

算法一

解题过程

首先,我们考虑一种内心的刻画方法(这种刻画方法在数学竞赛中被称为"鸡爪定理")。

设\(\triangle ABC\) 的内心为\(I\),\(AI\)与\(\triangle\) \(ABC\)的外接圆交于另一点\(M\),则\(BM = CM = IM\) 。

证明:由于$ \angle BAM = \angle CAM\(,故\) \angle BCM = \angle CBM\(,所以\)BM = CM\(。又因为\)\angle IBM = \angle CBM + \angle IBC = \frac{1}{2}(\angle CAB + \angle ABC) = \angle MAB + \angle ABI = \angle BIM\(,所以\)BM = MI$

(之后看这张图的时候\(B,C\)可能需要互换一下)

这样,如果我们固定了\(B,C\)两点,以及\(A\)在\(B,C\)与圆的哪一段弧上,我们就可以得到弧\(BC\)的中点\(M\)(\(M\)与\(A\)在\(BC\)异侧)。我们不能枚举\(A\)点,但是我们将\(I\)刻画为:\(M + (B - M) \cdot e^{i \angle AMB}\)。(解释:\((I - M) = (B - M) \cdot (\cos \angle AMB + i \sin \angle AMB)\))(这里我们使用了复平面的工具),那么\(M\)是固定的,\(B - M\)是固定的(即与\(A\)无关)。要求所有\(I\)的坐标之和,只需要知道\(e^{i \angle AMB}\)的和。虽然这个式子与\(A,B\)有关,但是与\(M,C\)均无关(圆周角相等)。

因此,我们先枚举\(B\),接着逆时针顺序枚举\(C\),在枚举的过程中顺便维护

<1> 从\(B\)逆时针到\(C\)的点\(A\)的数目。

<2> 对于从\(B\)逆时针到\(C\)经过的点\(A\),维护\(e^{i \angle AMB}\)的和(这个和与\(M\)的位置是无关的)。

如果我们固定了\(B,C\)的话,以及\(A\)在\(B,C\)与圆的哪一段弧上,可以算出\(M\)的值,也可以算出\(M\)对答案的贡献的次数。同时,\(B - M\)对每一个\(A\)是一样的,而\(e^{i \angle AMB}\)的和又是被维护出来的。这样,我们就可以以\(O(n^2)\)的复杂度算出内心的坐标和了。但是,每个内心被算了三次,而且我们最终答案是内心横纵坐标的期望,所以要将答案除以\(\frac{n(n - 1)(n - 2)}{2}\)

算法二

我们对称地考虑三个弧中点构成的三角形。设这三个点\(D,E,F\)对应的复数也是\(D,E,F\),则我们通过计算角度发现内心对于的复数就是\(D + E + F\)。

证明1:这个三角形的重心为\(\frac{D + E + F}{3}\),并且由欧拉线定理及比例关系容易得到垂心\(H = D + E + F\)

证明2: 只需证明\(H' = D + E + F\)时,\((H' - D)\)与\((E - F)\)垂直,而\((\vec{OE} + \vec{OF}) \cdot (\vec{OF} - \vec{OE}) = \lvert \vec{OF} \rvert ^2 - \lvert \vec{OE} \rvert ^2 = 0\),故\(D + E + F\)是\(\triangle DEF\)的垂心。

得到了这个结论过后,我们枚举两个点,以及它们对应的一段弧,计算出这段弧的中点以及不在这段弧上的点的个数,就可以得到这段弧中点的复数值在最终答案里面出现的次数,再将它们相加即可。

时间复杂度仍然为\(O(n^2)\)。

代码实现


#include <bits/stdc++.h>
using namespace std; const int N = 3005;
const double PI = acos(-1), eps = 1e-10; int n, L;
double alpha[N], ansx = 0.0, ansy = 0.0; double midpoint (double x1, double x2) {
double len = x2 - x1;
if (len < -eps) len += 2.0 * PI;
len /= 2.0;
double mid = x1 + len;
if (mid >= 2.0 * PI - eps) mid -= 2.0 * PI;
return mid;
} int main () {
scanf("%d%d", &n, &L);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
alpha[i] = 2.0 * PI * x / L;
} for (int i = 0; i < n; i++) {
double nowx = 0.0, nowy = 0.0;
for (int j = (i + 1) % n, k = 0; j != i; j = (j + 1) % n, k++) {
double m = midpoint(alpha[j], alpha[i]), arg = alpha[j] - alpha[i];
double vecx = cos(alpha[i]) - cos(m), vecy = sin(alpha[i]) - sin(m); ansx += cos(m) * k, ansy += sin(m) * k;
ansx += vecx * nowx - vecy * nowy, ansy += vecx * nowy + vecy * nowx; if (arg < -eps) arg += 2.0 * PI;
nowx += cos(arg / 2.0), nowy += sin(arg / 2.0);
}
} ansx /= 0.5 * n * (n - 1) * (n - 2), ansy /= 0.5 * n * (n - 1) * (n - 2);
printf("%.10lf %.10lf", ansx, ansy);
return 0;
}

AGC039D 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. linux 会话 进程组 守护进程

    Linux 下每个进程都会有一个非负整数表示的唯一进程 ID ,简称 pid . Linux 提供了 getpid 函数来获取 进程的 pid ,同时还提供了 getppid 函数来获取父进程的 pi ...

  2. vscode remote wsl 的NoPermissions permission denied问题

    在 wsl这个目录  code-insiders . 之后会报这个错 无法打开"wsl": Unable to read file (NoPermissions (FileSyst ...

  3. Vmware Tools is currently being installed on your system

    问题描述: 使用虚拟机安装Ubuntu过程中一直停留在"PLEASE WAIT! Vmware Tools is currently being installed on your syst ...

  4. LeetCode 中等题解(1)

    16 最接近的三数之和 Question 给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和. ...

  5. 讲武德,你们要的高性能日志工具 Log4j2,来了

    Log4j 介绍过了,SLF4J 介绍过了,Logback 也介绍过了,你以为日志系列的文章就到此终结了? 不不不,我告诉你,还有一个 Log4j 2,顾名思义,它就是 Log4j 的升级版,就好像手 ...

  6. NPOI读写Excel组件封装Excel导入导出组件

    后台管理系统多数情况会与Excel打交道,常见的就是Excel的导入导出,对于Excel的操作往往是繁琐且容易出错的,对于后台系统的导入导出交互过程往往是固定的,对于这部分操作,我们可以抽离出公共组件 ...

  7. CorelDRAW中的合并和群组功能

    在设计过程中,对象就是我们进行操作的主体,这个操作主体可以是单个对象,也可以是多个对象,在有多个对象要进行处理时,就需要用到类似CorelDRAW里的合并和群组这两个功能了. 一.合并与拆分 合并功能 ...

  8. jQuery 第四章 实例方法 DOM操作_基于jQuery对象增删改查相关方法

    .next() .prev() .nextAll() .prevAll() .prevUntil() .nextUntli() .siblings() .children() .parent() .p ...

  9. python办公入门4:xlrd操作excel行

    操作excel行 1 #通过索引获取操作行 2 sheet=data.sheet_by_index(0) 3 #获取当前sheet下的有效行数 4 print(sheet.nrows) 5 #获取某一 ...

  10. BackgroundService 大佬教的好

    BackgroundService 源码分析 因为换了工作也有两个多月没有写博客啦,因为跟着红超哥(大佬)一直在学习和做项目(反正就是在潜心修炼,大佬每天也是在我十万个为什么中度过的.) 最近在做一个 ...