重心:三条中线的交点,
垂心:三条高的交点
内心:三条角平分线的交点
外心:三条垂直平分线的交点
考虑一个圆上的三角形ABC,我们取这三段弧的中点,记为A' B' C'
题解开始啦!『It can be proved here that』ABC的内心和A'B'C'的垂心是一样的
题解又开始啦!『 it is known that』对于一个三角形,它的垂心、重心、外心在一条直线上,并且|垂心-重心|:|重心-外心| = 2:1
然后我们其实要找的是A'B'C'的垂心,又A'B'C'的外心是(0,0),重心就是三点坐标的和除以3,所以垂心就是重心的坐标乘以三,也就是三点坐标的和了。
那么我们枚举两个点,考虑第三个点的贡献
不妨叫这两个点BC,显然A点在优弧上的时候,A'在劣弧上,反之亦然,
那么将贡献乘以点的个数即可
#include <bits/stdc++.h>
#define yxn inline
using namespace std;
typedef double db;
typedef long long ll;
const db pi = acos(-1);
int n,l;db t[3003],x,y;
yxn void add(db rad,int cnt){
x+=cos(rad)*cnt;
y+=sin(rad)*cnt;
}
int main(){
scanf("%d%d",&n,&l);
for(int i=0;i<n;i++){
scanf("%lf",&t[i]);
t[i]=t[i]/l*2*pi;
}
sort(t,t+n);
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
db m1=(t[i]+t[j])/2,m2=m1+pi;
add(m1,i+n-j-1);
add(m2,j-i-1);
}
}
db all = 1.0*n*(n-1)*(n-2)/6;
x/=all,y/=all;
printf("%.11f %.11f\n",x,y);
}