0%

「CF1354C2」Not So Simple Polygon Embedding

题目链接

写在前面

比赛时思路对了,代码挂了(

我真是个人才。

题意

给定 n(n∈{2k+1∣k∈N∗})n(n\in\{2k+1\mid k\in\mathbb N^*\}),求能包括正 2n2n 边形的正方形的最小边长。

思路

先求出这个多边形的直径,为 1sin⁡180∘2n\large\frac1{\sin\frac{180^\circ}{2n}}。

然后我们看看两个例子。

正六边形

正六边形

容易看出,∠OAX=∠AYO+∠AOY=45∘+30∘=75∘\angle OAX=\angle AYO+\angle AOY=45^\circ+30^\circ=75^\circ。

∠AOY\angle AOY 是怎么得出的呢,它是 360∘62\large\frac{\frac{360^\circ}6}2,即 180∘2n\frac{180^\circ}{2n}。

正方形边长即为 DH=AD⋅sin⁡∠OAXDH=AD\cdot\sin\angle OAX。

正十边形

正十边形

同理:

∠OAX=∠AYO+∠AOY=45∘+36∘=81∘∠AOY=2⋅360∘102=2⋅180∘2nFH=AF⋅sin⁡∠OAX\begin{aligned} \angle OAX&=\angle AYO+\angle AOY=45^\circ+36^\circ=81^\circ\\ \angle AOY&=\frac{2\cdot\frac{360^\circ}{10}}2=\frac{2\cdot180^\circ}{2n}\\ FH&=AF\cdot\sin\angle OAX \end{aligned}

正 2n 边形

它的最小包括正方形的边长为:

1sin⁡180∘2n⋅sin⁡(⌊n2⌋⋅180∘2n+45∘)\frac1{\sin\frac{180^\circ}{2n}}\cdot\sin(\frac{\lfloor\frac n2\rfloor\cdot180^\circ}{2n}+45^\circ)

实现

C++ cmath 库中的三角函数是弧度制的,所以答案为 sin⁡(⌊n2⌋⋅π2n+π4)sin⁡π2n\large\frac{\sin(\frac{\lfloor\frac n2\rfloor\cdot\pi}{2n}+\frac\pi4)}{\sin\frac\pi{2n}}。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<cstdio>
#include<cmath>
using namespace std;
const double pi=acos(-1);
int t,n;
int main()
{
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
printf("%.8lf\n",sin(pi*(n/2)/n/2+pi/4)/sin(pi/n/2));
}
return 0;
}