SRM449 div1 easy

こーどが余りきれいではないけれど、とりあえず、誤差に注意する.

X*X = a*a + b*bのとき、
aの値がわかれば、 b = sqrt(X*X - b*b)でわかる。
#define INF (1 << 30)
#define eps (1e-9)

#define X first
#define Y second

 
using namespace std;

typedef pair<int, int> pii;
typedef pair<int, int> Dot;
typedef long long LL;

vector<Dot> solve(int num) {
  vector<Dot> ans;
  for(int i = (int)sqrt(num/2 + 0.5); i <= (int)sqrt(num + 0.5)+1; i++) {
    double tmp = sqrt(num - i*i) - (int)sqrt(num - i*i + 0.5);
    if(fabs(tmp) < eps) {
      ans.push_back( Dot(i, (int)sqrt(num-i*i+0.5)) );
    }      
  }
  return ans;
}

class MaxTriangle {
public:
  double calculateArea(int A, int B) {
    vector<Dot> dotA = solve(A);
    vector<Dot> dotB = solve(B);
    if(dotA.size() == 0 || dotB.size() == 0) {
      return -1;
    }
    double maxi = 0;
    for(int i = 0; i < dotA.size(); i++) {
      for(int j = 0; j < dotB.size(); j++) {	
	double arg = fabs( atan2(dotA[i].Y, dotA[i].X) - atan2(dotB[j].Y, dotB[j].X) );
	maxi = max( maxi, 0.5*sqrt(A)*sqrt(B)*max(sin(arg), sin(arg+M_PI_2)) );
      }
    }
    return maxi;		   
  }