Problem:
魔法陣

Problem Statement

〜魔法陣の描き方〜

十分広くて真っ白な床を用意します．

床の座標 (0,0) の点を中心にして，半径 1, 2, ..., R の円を描きます．

半径 1 の円と半径 2 の円の間，半径 3 の円と半径 4 の円の間，... を青色で塗ります．なお，半径 R の円の外には色を塗ってはいけません．

床に頂点数 N の多角形を一つ描きます．

多角形の内部の白色の領域を青色で，青色の領域を白色で塗りなおします．

魔法陣の力は，魔法陣に青色が多く含まれるほど強くなるという．

そこであなたには，魔法陣に含まれる青い領域の面積を求めてほしい．

次の図はこの手順で描くことのできる魔法陣の一例である．

Input

入力は以下の形式に従う．与えられる数は全て整数である．

N R
x_1 y_1
...
x_N y_N

(x_i, y_i) は多角形の i 番目の頂点である．

Constraints

3 ≦ N ≦ 100

1 ≦ R ≦ 100

多角形は半径 R の円の内部または円周上に含まれる．

多角形は自己交差をもたない．

多角形の頂点は反時計回りの順番で与えられる．

Output

青い領域の面積を 1 行に出力せよ．

出力する値は，真の値との絶対誤差または相対誤差が 10^{-8} 未満でなければならない．

Sample Input 1

3 1
0 0
1 0
0 1

Output for the Sample Input 1

0.500000000

Sample Input 2

3 2
0 0
2 0
0 2

Output for the Sample Input 2

8.995574288

Sample Input 3

3 2
1 -1
1 1
-2 0

Output for the Sample Input 3

11.123246567

Sample Input 4

4 3
1 1
-1 1
-1 -1
1 -1

Output for the Sample Input 4

11.707963268

Solution in C++ (judge verdict: Runtime Error)

#include<complex>
#include<cstdio>
#include<iostream>
#include<queue>
#include<cassert>

using namespace std;

#define rep(i, n) for (int i = 0; i < int(n); ++i)
template<class T> T at(vector<T> v, int i) {return v[i % v.size()];}


#define X real()
#define Y imag()

typedef long double D;
typedef complex<D> P;
struct L{P a, b;};
typedef vector<P> Pol;

const D EPS = 1e-8;
const D PI = acos(-1);

// 比較関数
int sig(D a, D b = 0) {return a < b - EPS ? -1 : a > b + EPS ? 1 : 0;}
bool near(P a, P b) {return !sig(norm(a - b));}

// 平方根
D sr(D a) {return sqrt(max(a, (D)0));}

// 内積
D dot(P a, P b) {return a.X * b.X + a.Y * b.Y;}
// 外積
D det(P a, P b) {return a.X * b.Y - a.Y * b.X;}

// 線分のベクトル
P vec(L a) {return a.b - a.a;}

// 有向角度
D arg(P base, P a, P b) {assert(!isnan(arg((b - base) / (a - base))));return arg((b - base) / (a - base));}

// 射影
P proj(P a, P b) {return a * dot(a, b) / norm(a);}
P perp(L l, P p) {return l.a + proj(vec(l), p - l.a);}

// 距離
D dLP(L l, P p) {return abs(det(vec(l), p - l.a) / vec(l));}
D dSP(L s, P p) {
  if (dot(vec(s), p - s.a) < 0) return abs(p - s.a);
  if (dot(vec(s), p - s.b) > 0) return abs(p - s.b);
  return dLP(s, p);
}

// 円
struct C{P c; D r;};

// 交差判定
bool iCS(C c, L s) {return sig(c.r, dSP(s, c.c)) >= 0;}

// 交点
pair<P, P> pCL(C c, L l) {
  P x = perp(l, c.c);
  P y = vec(l) / abs(vec(l)) * sr(c.r * c.r - norm(x - c.c));
  return make_pair(x - y, x + y);
}

// 円と円の中心,p1,p2からなる三角形の共通部分面積
D aCT(C c, P p1, P p2) {
  p1 -= c.c; p2 -= c.c; c.c = 0;
  if (near(0, p1) || near(0, p2) || near(p1, p2)) return 0;
  if (!iCS(c, (L){p1, p2})) return c.r * c.r * arg(0, p1, p2) / 2;
  bool b1 = sig(abs(p1), c.r) > 0, b2 = sig(abs(p2), c.r) > 0;
  pair<P, P> pp = pCL(c, (L){p1, p2});
  if (b1 && b2) return (c.r * c.r * (arg(0, p1, pp.first) + arg(0, pp.second, p2)) + det(pp.first, pp.second)) / 2;
  if (b1) return (c.r * c.r * arg(0, p1, pp.first) + det(pp.first, p2)) / 2;
  if (b2) return (c.r * c.r * arg(0, pp.second, p2) + det(p1, pp.second)) / 2;
  return det(p1, p2) / 2;
}

// 円と多角形の共通部分面積
D aCPol(C c, Pol pol) {D res = 0; rep (i, pol.size()) res += aCT(c, pol[i], at(pol, i + 1)); return res;}

int main() {
  int n, r;
  cin >> n >> r;
  Pol pol(n);
  rep (i, n) cin >> pol[i].X >> pol[i].Y;
  D res = 0;
  for (int i = 1; i < r; i += 2) res += (2 * i + 1) * PI - (aCPol((C){0, (D)i + 1}, pol) - aCPol((C){0, (D)i}, pol));
  for (int i = 0; i < r; i += 2) res += aCPol((C){0, (D)i + 1}, pol) - aCPol((C){0, (D)i}, pol);
  //assert(!isnan(res));
  printf("%.12Lf\n", res);
  return 0;
}