#include <iostream>
#include <cmath>

template <int N> class autodif {
	public:
	double v;
	double d[N];

	autodif() {
	}

	autodif(const double& x) {
		v = x;
		for (int i=0; i<N; i++) d[i] = 0;
	}

	autodif(const double& x, int n) {
		v = x;
		for (int i=0; i<N; i++) d[i] = 0;
		d[n] = 1;
	}

	friend autodif operator+(const autodif& a, const autodif& b) {
		autodif r;

		r.v = a.v + b.v;
		for (int i=0; i<N; i++) r.d[i] = a.d[i] + b.d[i];

		return r;
	}

	friend std::ostream& operator<<(std::ostream& s, const autodif& x) {
		int i;

		s << x.v;
		s << '<';
		for (i=0; i<N; i++) {
			s << x.d[i];
			if (i != N-1) {
				s << ',';
			}
		}
		s << '>';
		return s;
	}
};
