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边形之间夹一个lcm(n,m)lcm(n,m)边形,这样能保证内部的的可以角顶角,外部的的可以边顶边,这样就可以很方便的推出公式来了

反正最后的结论就是l=cos(πlcm(m,n))tan(πm)sin(πn)l= frac{cos(frac{π}{lcm(m,n)})* tan(frac{π}{m})}{sin( frac{π}{n})}

然后随便乱搞一下就出来了

#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
",cos(pai/lcm(n,m))*tan(pai/m)/sin(pai/n));
    }
    return 0;
}