10540 - Flower of Beautiful Mind

問題概要

円が等間隔に並べられる。このとき条件にしたがって重なっている部分の面積を求めよう。

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>

using namespace std;

typedef double elem;
const elem pi = acos(-1);

elem theta(int n, int i){
  return 2.*( pi-(( (pi*i)/n+(pi)/2.)));
}

elem AreaOfLayer(elem R, int N, int i){
  return 2*N*(pi*R*R*theta(N,i)/(2*pi)-0.5*R*R*sin(theta(N,i)));
}

main(){
  int n;
  elem r;
  int counter = 0;

  while(cin >> r >> n && n){
    int layers = (n+1)/2;
    printf("Set %d:\n%d\n",++counter, layers);
    
    elem layer[ layers ];
    elem V[ layers ];
    elem P[ layers ];

    for(int i = 0; i < layers; ++i)
      layer[i] = AreaOfLayer( r, n, i );
    //2.*n*(pi*r*r*theta(n,i)/(2.*pi)-.5*r*r*sin(theta(n,i)));

    reverse(layer,layer+layers);

    V[0] = layer[0];
    for(int i = 1; i < layers; i++){
      V[i] = layer[i];
      for(int j = i - 1; j >= 0; --j){
	V[i] -= 2*V[j];
      }
      for(int j = i - 2; j >= 0; --j){
	V[i] -= (i - 2 - j + 1) * V[j];
      }
    }
    
    for(int i = 0; i < layers; i++)
      printf("%.4lf %.4lf\n",layer[i], V[i]);
  }
  return 0;
}

解法

一つ円を決めて各レイヤを作り出す円同士がどのくらいの角度を持っているか出し、
さらに扇形の面積から三角形の面積を引いて求める面積の式を立てる