UESTCSpring科学营——蛋糕(结论题)
今天是鲍勃的生日,爱丽丝打算做一个蛋糕送给他。
这是鲍勃的 n 岁生日,所以爱丽丝的蛋糕必须是正 n 边形。而且,鲍勃很喜 欢数字 m,所以这个蛋糕必须放在一个正 m 边形的盒子里。为了让气氛更加浪漫, 爱丽丝将在蛋糕的中心插上一根蜡烛,显然,蜡烛既在蛋糕的中心,又在盒子的 中心是最好的。
换句话说,爱丽丝应该使正 n 边形的蛋糕能被容纳在正 m 边形的盒子里,且 使其中心重合。事实上,爱丽丝已经做好了蛋糕,蛋糕是边长为 1 的正 n 边形, 现在她想知道,正 m 边形盒子的最小边长是多少。
输入
每组测试数据包含多行,以 EOF 作为文件结束,每行包括两个正整数 n 和 m
输出
输出包含多行,每行包含一个整数,代表最小的符合条件的正 m 边形盒子的 边长,保留 4 位小数。
样例输入
【样例输入 1】
4 8
【样例输出 1】
0.5412
【样例输入 2】
8 4
【样例输出 2】
2.4142
样例输出
提示
对于 20%的数据,n,m≤100;
对于 40%的数据,n,m≤10000;
对于 60%的数据,n,m≤1000000;
对于 80%的数据,n,m≤100000000;
对于 100%的数据,n,m≤1000000000。
神tm1e9岁生日
结论证不了
只会打表瞎yy推80分规律
真正证法是要在n边形和m边形之间夹一个边形,这样能保证内部的的可以角顶角,外部的的可以边顶边,这样就可以很方便的推出公式来了
反正最后的结论就是
然后随便乱搞一下就出来了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll m,n;
const double pai=acos((double)-1);
inline int gcd(ll a,ll b){
if(b==0)return a;
else return gcd(b,a%b);
}
inline int lcm(ll a,ll b)
{
return a*b/gcd(a,b);
}
int main(){
while(scanf("%I64d%I64d",&n,&m)!=EOF)
{
printf("%.4lf\n",cos(pai/lcm(n,m))*tan(pai/m)/sin(pai/n));
}
return 0;
}