题目链接

题面:

题意:
给定三个同心圆,在这三个圆上分别选择一点,然后问这三点组成的三角形的面积的期望值。

官方题解:

题解:
就是说A点任意确定即可,然后我们可以等分一个半圆枚举B点,求出C点到AB距离的期望。
一开始是写出AB的表达式,然后再用距离公式求出期望,发现。。。积分积不动。


参考这张图。
A点是确定一点,B点是等分枚举点。
设当前B点的坐标为 r 2 c o s α r 2 s i n α (r2 cosα,r2 sinα) r2cosαr2sinα
我们转换坐标系,其中x轴垂直于AB。
我们设D为最大圆上一点,坐标为 r 3 c o s β r 3 s i n β (r3 cosβ,r3 sinβ) r3cosβr3sinβ,那么D点到直线AB的距离为
r 3 s i n O C E r 3 c o s β O C E p p | r3 * sin∠OCE - r3 * cosβ | ,我们设∠OCE为 p (p可求) r3sinOCEr3cosβOCEpp

那么D到直线AB的距离就是 r 3 s i n p r 3 c o s β | r3 * sinp- r3 * cosβ | r3sinpr3cosβ

那么从 0 2 p i r 3 s i n p r 3 c o s β d β / 2 p i 0到 2 * pi 的 ∫ | r3 * sinp- r3 * cosβ | dβ /(2 * pi ) 02pir3sinpr3cosβdβ/2pi就是期望距离

a n s = 2 r 3 0 p i s i n p c o s β d β / 2 p i ans=2 * r3 * (0到pi)的 ∫ | sinp - cosβ | dβ /(2 * pi) ans=2r30pisinpcosβdβ/2pi

c o s ( p i / 2 α ) = s i n α s i n p = c o s β 由cos ( pi/2 - α ) = sin α 和 sinp = cosβ cos(pi/2α)=sinαsinp=cosβ

0 p i / 2 p p i / 2 p p i 可分为 0--pi/2-p 和 pi/2-p--pi上的积分。 0pi/2ppi/2ppi

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<bitset>
#include<map>
#include<unordered_map>
#include<set>
#define ui unsigned int
#define ll long long
#define llu unsigned ll
#define ld long double
#define pr make_pair
#define pb push_back
//#define lc (cnt<<1)
//#define rc (cnt<<1|1)
#define len(x) (t[(x)].r-t[(x)].l+1)
#define tmid ((l+r)>>1)
using namespace std;

const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e18;
const int mod=1e9+7;
const double eps=1e-8;
const double pi=acos(-1.0);
const int hp=13331;
const int maxn=100100;
const int maxm=100100;
const int up=1000;


int main(void)
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int r1,r2,r3;
        scanf("%d%d%d",&r1,&r2,&r3);
        if(r1>r2) swap(r1,r2);
        if(r2>r3) swap(r2,r3);
        if(r1>r2) swap(r1,r2);
        double ans=0;
        double x1=r1,y1=0;
        for(int i=1;i<=up;i++)
        {
            double aerfa=(i-0.5)/up*pi;
            double x2=r2*cos(aerfa),y2=r2*sin(aerfa);
            double disab=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
            double d=r1*r2*sin(aerfa)/disab;
            double p=asin(d/r3);
            double exdis=2*r3*(cos(p)+p*sin(p))/pi;
            ans+=disab*exdis/2;
        }
        printf("%.1f\n",ans/up);
    }
    return 0;
}