ICPC 2007 Regional Problem J

nobuに考えてもらったDPで__________案の解法を書いてみた。書いてわかったけど__________華麗すぎる。

#include <iostream>
#include <cassert>
#include <vector>
#include <complex>
#include <cmath>
using namespace std;

typedef complex<double> pt;
typedef vector<pt> sol_t;
const double PI = atan(1.)*4;

int main() {
  if (freopen("J.in", "r", stdin) == NULL) assert(false);
  int a,m,b,n;
  while (cin>>a>>m>>b>>n, a|m|b|n) {
    sol_t sa(m), sb(n);
    for (int i = 0; i < m; i++) {
      double val = pow((double)a,1./m);
      sa[i] = polar(val,i*2*PI/m);
    }
    for (int i = 0; i < n; i++) {
      double val = pow((double)b,1./n);
      sb[i] = polar(val,i*2*PI/n);
    }
    const int size = n*m;
    sol_t sol(size);
    for (int i = 0; i < m; i++)
      for (int j = 0; j < n; j++)
        sol[i*n+j] = -sa[i] - sb[j];
    //for (int i = 0; i < size; i++) cout<<sol[i]<<" "; cout<<endl;
    sol_t tbl(size+1);
    tbl[0] = 1.;
    for (int i = 1; i <= size; i++)
      for (int k = i; k > 0; k--)
        tbl[k] += sol[i-1]*tbl[k-1];
    for (int i = 0; i <= size; i++) {
      if (i) cout<<" ";
      cout<<(int)floor(real(tbl[i])+1e-5);
    }
    cout<<endl;
  }
  return 0;
}

sampleは通ったけど本番データは誤差とかオーバーフローとかだいじょうぶかはわからない。
そもそも出力の仕方間違っていたwスペース最後に含んじゃいけないのね。
さらに、誤差の問題で1e-5まではOKだけどそれよりも小さくするとだめなことがわかった。まぁこの場合0.5足しときゃ安心って話はあるけど、しっかり誤差が見積もれるようになりたいなぁ。