1. 程式人生 > >2018.10.09 NOIP訓練 蛋糕(數學)

2018.10.09 NOIP訓練 蛋糕(數學)

描述

今天是鮑勃的生日,愛麗絲打算做一個蛋糕送給他。 這是鮑勃的 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。

標籤

UESTCSpring科學營

數學推導。 本蒟蒻首先花了40min推了一個80ptspts的錯誤結論。 看了stdstd程式碼之後改對了。 實際上: ans=cosπlcm(n,m)tanπmsinπnans=\frac {\cos{\frac {\pi} {lcm(n,m)}}*\tan{\frac {\pi} {m}}} {\sin{\frac {\pi} {n}}}

注意開longlong doubledouble 程式碼:

#include<bits/stdc++.h>
#define ld long double
#define ll long long
using namespace std;
ld n,m;
ld pi=acos(-1.0);
inline ld lcm(ld a,ld b){return (ld)a*b/__gcd((ll)a,(ll)b);}
int main(){
	while(~scanf("%Lf%Lf",&n,&m)
)printf("%.4Lf\n",cos(pi/(ld)lcm(n,m))/sin(pi/n)*tan(pi/m)); return 0; }