有一個邊長爲 \(1\) 的正 \(n\) 邊形,你要把這個正 \(n\) 邊形放到一個正 \(m\) 邊形裏面,且兩個多邊形的中心重合。dom
問你這個正 \(m\) 邊形的邊長最小是多少。spa
\(n,m\leq {10}^9\)3d
對於一種合法的方案,把這個正 \(n\) 邊形旋轉 \(\frac{2\pi}{m}\) 度以後也能放到這個正 \(m\) 邊形裏面。code
那麼把全部 \(\frac{m}{\gcd(n,m)}\) 種多邊形拼到一塊兒以後就會獲得一個 \(\operatorname{lcm}(n,m)\) 邊形。blog
如今咱們要把正 \(\operatorname{lcm}(n,m)\) 邊形塞進一個正 \(m\) 邊形。get
這就很簡單了。string
這個正 \(m\) 邊形的每條邊對準這個正 \(\operatorname{lcm}(n,m)\) 邊形就行了。it
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<ctime> #include<utility> #include<functional> #include<cmath> #include<vector> //using namespace std; using std::min; using std::max; using std::swap; using std::sort; using std::reverse; using std::random_shuffle; using std::lower_bound; using std::upper_bound; using std::unique; using std::vector; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef std::pair<int,int> pii; typedef std::pair<ll,ll> pll; void open(const char *s){ #ifndef ONLINE_JUDGE char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout); #endif } void open2(const char *s){ #ifdef DEBUG char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout); #endif } int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;} void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');} int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;} int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;} const db pi=acos(-1); ll gcd(ll a,ll b) { return b?gcd(b,a%b):a; } ll n,m; int main() { open("b"); scanf("%lld%lld",&n,&m); db r=1./2/sin(pi/n); n=n/gcd(n,m)*m; r*=cos(pi/n); db ans=r*tan(pi/m)*2; printf("%.10f\n",ans); return 0; }