day46-左骏驰

T3 AT5618 [AGC039D] Incenters

在平面中给定n个位于单位圆上的点,坐标形如((cosfrac{2pi T_i}{L},sinfrac{2pi T_i}{L})),等概率随机地选取其中不同的三个点组成三角形,求三角形的内心(即,内切圆的圆心)的横纵坐标期望。

$3le n le 3000, n le L le 10^9, 0le T_i< L, T_ile 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;
}
原文地址:https://www.cnblogs.com/R-Q-R-Q/p/13139910.html