day46-左骏驰
T3 AT5618 [AGC039D] Incenters
在平面中给定n个位于单位圆上的点,坐标形如\((\cos\frac{2\pi T_i}{L},\sin\frac{2\pi T_i}{L})\),等概率随机地选取其中不同的三个点组成三角形,求三角形的内心(即,内切圆的圆心)的横纵坐标期望。
$3\le n \le 3000, n \le L \le 10^9, 0\le T_i< L, T_i\le T_{i+1} $.
solution
Get 一个数学知识点,方便退役之后用。。。QAQ
但是证明在这儿
我这儿只有结论,相信你们那么巨,推一推就出来了。
结论
- 一个三角形的内心是它外接圆,被三个点分成的三段圆弧的三个中点组成的三角形的垂心。
- 外心到中心的距离是外心到垂心距离的\(\frac{1}{3}\)
D , E , F 分别是AB , AC, BC,的中点。
I 既是三角形ABC的内心,也是三角形DEF的垂心。
O 是外心,G是重心,H是垂心,都是三角性ABC的。
\(OG = \frac{1}{3}OH\)
然后,在本题中
在这题中,圆心 OO 恰在原点,而平面中三点 (x_A,y_A),(x_B,y_B),(x_C,y_C)组成的三角形重心之坐标为 \((\frac{x_A+x_B+x_C}{3},\frac{y_A+y_B+y_C}{3})\) ,所以对于任意 \(ABC\) ,三段弧中点的坐标之和,就是 ABC 内心的坐标。
然后考虑一个点被统计多少次即可。
主要是用两个点求出它在优弧上和劣弧上的中点的坐标,在统计用了多少次即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define pi 3.14159265358979323846
using namespace std;
const int N = 3010;
int n , L;
int t[N];
int main()
{
scanf("%d%d" , &n , &L);
for(int i = 1 ; i <= n ; ++i) scanf("%d" , &t[i]);
double ansx = 0 , ansy = 0;
for(int i = 1 ; i <= n ; ++i)
for(int j = i + 1 ; j <= n ; ++j)
{
double tmp = pi * (t[i] + t[j]) / L;
ansx += cos(tmp) * (n - 2 * (j - i - 1) - 2);
ansy += sin(tmp) * (n - 2 * (j - i - 1) - 2);
}
ansx /= (double)n * (n - 1) * (n - 2) / 6.0;
ansy /= (double)n * (n - 1) * (n - 2) / 6.0;
printf("%.10f %.10f" , ansx , ansy);
return 0;
}