题目描述

给定在笛卡尔坐标系的单位圆上的\(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. 预估ceph的迁移数据量

    引言 我们在进行 ceph 的 osd 的增加和减少的维护的时候,会碰到迁移数据,但是我们平时会怎么去回答关于迁移数据量的问题,一般来说,都是说很多,或者说根据环境来看,有没有精确的一个说法,到底要迁 ...

  2. My SQL的基本操作(总结)

    My SQL的基本操作(总结) 因为本人目前是学生,前一段时间因为一些原因没有按时更新博客,今天我来总结一下My SQL的基本操作. 一.下载与安装 windows版本MySQL下载地址: http: ...

  3. 莫小安 Linux下Redis的安装与配置

    转载自--Linux下Redis的安装与配置 redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcached类似,但很大程度补偿了 memcached的不足,它 ...

  4. 寻找cmd的管理员运行

    (快捷键----打开"cmd"----"win+R") 在进行环境配置测试中,有些是需要将cmd用管理员方式来运行才可以,但是,当你在"开始" ...

  5. oss文件上传删除(批量删除)处理

    博主用的是阿里云的oss 首先先在阿里云下载安装sdk,相关的sdk下载请自行到阿里云下载 文档地址   https://help.aliyun.com/document_detail/85580.h ...

  6. 面试官:小伙子,给我说一下spring框架吧

    1. spring是什么 轻量级开源框架 以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核. 还能整 ...

  7. 如何在MathType输入手写体a

    作为强大的数学公式编辑器,MathType中还能设置各种样式,还支持自定义设置,给大家编辑公式提供了更多的便利.那么有用户问:要如何将输入的字母a变为手写体呢?下面就来一起学习. 输入手写体a的步骤如 ...

  8. 【基于PUPPETEER前端自动化框架】【一】TypeScript+Puppeteer+Jest 整合

    前提:掌握Jest + Puppeteer 1.Jest环境配置 2.Jest-MATCHERS匹配器 3.Jest-全局变量设置 4.Puppeteer安装 5.Puppeteer元素获取 6.Pu ...

  9. LIS问题$n log_2 n$做法(二分优化)

    #include<bits/stdc++.h> using namespace std; const int inf=1e9+5; const int maxn=1e6+5; int n, ...

  10. Vue—新版本router-view 与 keep-alive 的互动

    1. <keep-alive> 直接嵌套到 <router-view> 上会失效,正确写法: <router-view #="{ Component }&quo ...