CF1C Ancient Berland Circus
传送门:点这里
题意:利用三个点求最小正多边形的面积。
上图:
手稿,有点丑
思路:一个正多边形,其每个点必把圆平分,且中心事原点。设有:多边形在圆上的点把圆平分成了N段(就是像切蛋糕一样把圆切成了N块大小相等的蛋糕)。那么我们只需要求一个的大小,再乘以N。
N=2 * pi / t(t为每块的圆心角)
每块的面积为:R * R* sin t / 2
总面积为:pi * R * R * sin t / t
如此,我们只要求R和t就可以了。
首先利用海伦公式求出圆上三点的三角形的面积。
海伦公式:S = sqrt ( p * ( p - a ) * ( p - b ) * ( p - c ) )
p = ( a + b + c ) / 2;
利用海伦公式之前 我们先求出三角形每条边的长度(用两点间的距离公式即可)
有面积后 正弦定理求R 余弦定理求角(这个不说了)
求出∠AOC和∠OBC
既然我们要求每块的圆心角t,那么利用gcd找到单位角就可以了 单位角即为公约数
但是这是不正确的因为会有误差 所以我们需要第三个角∠AOB(大的那个,不是∠AOC+∠OBC)
用三个角求公约数,求出单位角t
警告:注意精度
自己写一个浮点数的gcd 精确到0.001即可 反正我不知道为何我精度切的更小的时候就WA了(小数取余用fmod函数)
最后保留6位小数即可
精度真的重要 也很玄学
代码如下:
#include <bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define fo1(a,b) for(int a=0;a<b;++a)
#define fo2(a,b) for(int a=1;a<=b;++a)
#define inf 0x3f3f3f3f
using namespace std