L题(直接求五种正多面体的新边长通项公式,而无分类讨论)
下文证明凸正多面体有且仅有五种:
设凸正多面体一个顶点向外有 条棱,设一个面是正 边形。每个顶点附近的空间角加起来必须满足小于 ,不然这个点不复存在(平了),正多边形外角和是 度,故每个外角为 度,每个内角为 ,固有:
观察可知可以枚举法得到该方程的唯五整数解为
根据欧拉公式 ,每条棱属于两个点即 ,每条边属于两个面,即 ,解三元一次方程组得,分别是 ;边数 为 。证毕。
参考这个文献,可知经过题意变换后,正四面体还是正四面体,正方体与正八面体相互转换,正十二面体和正二十面体相互转换。
设每个面中心到边的距离为 ,边长为 ,边所对的圆心角为 ,根据三线合一 得
参考这个文章,可证正多面体二面角大小为 ,根据二面角正弦定理,解得新边长 为 得
#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;
}