#include #include #include using namespace std; #define PI 3.1415926535897932384626433832795028841971L #define DELTA 0.000000000001L //実は double で余裕みたい typedef long double ld; typedef complex cld; //定義域に移す ld trim(ld t){ if(t < -0.5 * PI){ return(t + PI); } if(t > 0.5 * PI){ return(t - PI); } return(t); } int main(void){ while(true){ int n; //入力 cin >> n; if(n == 0)break; cld p[n]; for(int i=0;i> x >> y; p[i] = cld(x, y); } //円の位置関係が変わらない区間の生成 vector theta; theta.push_back(-PI/2); theta.push_back( PI/2); ld xdiff[] = {-2.0L, 0.0L, 2.0L}; for(int i=0;i xandindex[n]; for(int j=0;j > lengthandtheta; cld v; v = cld(cos(tb), sin(tb)); lengthandtheta.push_back(make_pair(length + real(v * factor), tb)); v = cld(cos(te), sin(te)); lengthandtheta.push_back(make_pair(length + real(v * factor), te)); ld t = trim(arg(conj(factor))); if(tb < t && t < te){ lengthandtheta.push_back(make_pair(length + abs(factor), t)); } //全体の最大値/最小値のアップデート for(int i=0;i len){ minlen = len; mint = t; } } } printf("%.20Lf\n", mint + 0.5*PI); printf("%.20Lf\n", maxt + 0.5*PI); } }