给定正
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 |
那么我们可以推出转换关系:
至此,可以通过递推得到答案。
#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 << fixed << setprecision(12);
K[4] = 1.0 / 3;
double fi = (1 + sqrtl(5)) / 2;
K[6] = sqrtl(2) / 2;
K[8] = sqrtl(2) / 3;
K[12] = 2 * fi / sqrtl(3 - fi) * fi / sqrtl(10 + 2 * sqrtl(5));
K[20] = (3 + sqrtl(5)) / 6 / fi;
nxt[4] = 4, nxt[6] = 8, nxt[8] = 6, nxt[12] = 20, nxt[20] = 12;
}
inline void solve(){
cin >> n >> a >> k;
if(n != 4 && n != 6 && n != 8 && n != 12 && n != 20){
cout << "impossible\n";
return;
}
for(int i = 1; i <= k; i++){
a *= K[n], n = nxt[n];
}
cout << "possible "<<n<<" "<<a<<endl;
}
signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
init();
int t = 1; cin >> t;
while(t--) solve();
return 0;
}