L题(直接求五种正多面体的新边长通项公式,而无分类讨论)

下文证明凸正多面体有且仅有五种:

设凸正多面体一个顶点向外有 n(n3)n(n\ge 3) 条棱,设一个面是正 m(m3)m(m\ge 3) 边形。每个顶点附近的空间角加起来必须满足小于 360°360°,不然这个点不复存在(平了),正多边形外角和是 360360 度,故每个外角为 360m\dfrac{360}m 度,每个内角为 180360m180-\dfrac{360}m,固有:

n(180360m)<3602n+2m>1n(180-\dfrac{360}m) < 360\Rightarrow \dfrac2n+\dfrac2m>1

观察可知可以枚举法得到该方程的唯五整数解为 (3,3),(3,4),(3,5),(4,3),(5,3)(3,3),(3,4),(3,5),(4,3),(5,3)

根据欧拉公式 V+FE=2V+F-E=2,每条棱属于两个点即 2E=nV2E=nV,每条边属于两个面,即 2E=mF2E=mF,解三元一次方程组得,分别是 V=4,6,8,12,20V=4,6,8,12,20;边数 EE4,8,6,20,124,8,6,20,12。证毕。

参考这个文献,可知经过题意变换后,正四面体还是正四面体,正方体与正八面体相互转换,正十二面体和正二十面体相互转换。

设每个面中心到边的距离为 dd,边长为 aa,边所对的圆心角为 α=2πm\alpha=\dfrac{2\pi}{m},根据三线合一 tanα2=da2\tan\dfrac \alpha2=\dfrac{d}{\dfrac a2}d=a2tanα2d=\dfrac a2\tan\dfrac\alpha2

参考这个文章,可证正多面体二面角大小为 δ=2arcsin(cosπncscπm)\delta=2\arcsin(cos\dfrac\pi n\csc\dfrac\pi m),根据二面角正弦定理,解得新边长 xxsinδ2=x2d\sin\dfrac\delta2=\dfrac{\dfrac x2}{d}x=cosπnasinπmtanπmx=\dfrac{\cos\dfrac\pi na}{\sin\dfrac\pi m\tan\dfrac\pi m}

#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%lld", &x)
typedef long long ll;
typedef long double db;
map<ll, pair<ll, ll>> h = {{4, {3, 3}}, {6, {3, 4}}, {8, {4, 3}}, {12, {3, 5}}, {20, {5, 3}}};
map<ll, ll> to = {{4, 4}, {6, 8}, {8, 6}, {12, 20}, {20, 12}};
ll t, v, a, k;
const db pi = acos(-1);
signed main()
{
    for (sc(t); t; --t)
    {
        sc(v), sc(a), sc(k);
        if (to.find(v) == to.end())
        {
            printf("impossible\n");
            continue;
        }
        db x = a;
        while (k--)
        {
            ll n = h[v].first, m = h[v].second;
            x *= cos(pi / n) / (sin(pi / m) * tan(pi / m));
            v = to[v];
        }
        printf("possible %lld %.12Lf\n", v, x);
    }
    return 0;
}