您当前的位置: 首页 > 

HeartFireY

暂无认证

  • 1浏览

    0关注

    334博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

“蔚来杯“2022牛客暑期多校训练营4 L.Black Hole 垃圾计算几何

HeartFireY 发布时间:2022-07-30 18:37:13 ,浏览量:1

L.Black Hole 题目大意

给定正 n n n面体(不一定合法,不合法就impossible),边长为 a a a,进行 k k k次操作,每次操作取正多面体几何中心连线生成新凸壳。问 K K K次操作后生成的是否为正多面体,以及最终正多面体的边长。

首先,合法的正多面体只有:正四面体、正六面体、正八面体、正十二面体、正二十面体。

  • 正四面体只能生成正四面体
  • 正六面体操作奇数次可以生成正八面体,偶数次生成正六面体
  • 正八面体操作奇数次可以生成正六面体,偶数次生成正八面体
  • 正十二面体操作奇数次可以生成正二十面体,偶数次生成正十二面体
  • 正二十面体操作奇数次可以生成正十二面体,偶数次生成正二十面体

接下来讨论边长变化规律:可以发现两次生成的边长关系可以由原体的内切球和生成体的外接球关系导出,因为这俩球是同一个球。那么首先我们整理一下边长 a a a与球半径 r r r关系公式:

正四面体正六面体正八面体正十二面体正二十面体内切球 r a = 6 12 \frac{r}{a} = \frac{\sqrt{6}}{12} ar​=126 ​​ r a = 1 2 \frac{r}{a} = \frac{1}{2} ar​=21​ r a = 6 6 \frac{r}{a} = \frac{\sqrt{6}}{6} ar​=66 ​​ r a = φ 2 2 3 − φ \frac{r}{a} = \frac{\varphi^2}{2\sqrt{3 - \varphi}} ar​=23−φ ​φ2​ r a = 3 3 + 15 12 \frac{r}{a} = \frac{3\sqrt{3} + \sqrt{15}}{12} ar​=1233 ​+15 ​​外接球 r a = 6 4 \frac{r}{a} = \frac{\sqrt{6}}{4} ar​=46 ​​ r a = 3 2 \frac{r}{a} = \frac{\sqrt{3}}{2} ar​=23 ​​ r a = 2 2 \frac{r}{a} = \frac{\sqrt{2}}{2} ar​=22 ​​ r a = 3 φ 2 \frac{r}{a} = \frac{\sqrt{3} \varphi}{2} ar​=23 ​φ​ r a = 10 + 2 5 4 \frac{r}{a} = \frac{\sqrt{10 + 2\sqrt{5}}}{4} ar​=410+25 ​ ​​

那么我们可以推出转换关系:

  • 正四面体 → \rightarrow →正四面体: a 2 a 1 = 1 3 \frac{a_2}{a_1} = \frac{1}{3} a1​a2​​=31​
  • 正六面体 → \rightarrow →正八面体: a 2 a 1 = 1 2 \frac{a_2}{a_1} = \frac{1}{\sqrt{2}} a1​a2​​=2 ​1​
  • 正八面体 → \rightarrow →正六面体: a 2 a 1 = 2 3 \frac{a_2}{a_1} = \frac{\sqrt{2}}{3} a1​a2​​=32 ​​
  • 正十二面体 → \rightarrow →正二十面体: a 2 a 1 = φ 2 3 − φ × 2 5 + 10 \frac{a_2}{a_1} = \frac{\varphi^2}{\sqrt{3 - \varphi} \times \sqrt{2 \sqrt{5} + 10}} a1​a2​​=3−φ ​×25 ​+10 ​φ2​
  • 正二十面体 → \rightarrow →正十二面体: a 2 a 1 = 5 + 3 6 φ \frac{a_2}{a_1} = \frac{\sqrt{5} + 3}{6 \varphi} a1​a2​​=6φ5 ​+3​

至此,可以通过递推得到答案。

Code
#include 
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define double long double
#define endl '\n'
using namespace std;

const int N = 2e5 + 10, MOD = 1e9 + 7;

double K[20];
int nxt[20], n, k;
double a;
void init(){
    cout  a >> k;
    if(n != 4 && n != 6 && n != 8 && n != 12 && n != 20){
        cout             
关注
打赏
1662600635
查看更多评论
0.0576s