Cod sursa(job #163117)

Utilizator scvalexAlexandru Scvortov scvalex Data 21 martie 2008 14:41:52
Problema Patrate2 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <iostream>
#include <fstream>

using namespace std;

class BigNum;

ostream& operator<<(ostream &, const BigNum &);

class BigNum {
public:
	BigNum() {
		len = 1;
		memset(data, 0, sizeof(data));
		data[0] = 1;
	}

	void operator*=(int other) {
		int r = 0;
		for (int i(0); i < len; ++i) {
			data[i] = other*data[i];
			r = data[i] / 10;
			data[i] %= 10;
		}
		if (r)
			data[len++] = r;
	}

	void operator*=(BigNum other) {
		BigNum c;
		c.data[0] = 0;

		for (int i(0); i < other.len; ++i) {
			int r = 0;
			for (int j(0); j < len; ++j) {
				c.data[i+j] += other.data[i]*data[j] + r;
				r = c.data[i+j] / 10;
				c.data[i+j] %= 10;
			}
			c.len = len + i;
			if (r)
				c.data[c.len++] += r;
		}
		len = c.len;
		memcpy(data, c.data, sizeof(data));
	}

	int data[4096];
	int len;
};

ostream& operator<<(ostream &os, const BigNum &bn) {
	for (int i = bn.len - 1; i >= 0; --i)
		os << bn.data[i];
	return os;
}

int N;

BigNum pow2(int n) {
	BigNum r;
	for (int i = 1<<30; i > 0; i >>= 1) {
		r *= r;
		if (i & n)
			r *= 2;
	}
	return r;
}

BigNum fact(int n) {
	BigNum r;
	for (int i(2); i <= n; ++i)
		r *= i;
	return r;
}

int main(int argc, char *argv[]) {
	ifstream fin("patrate2.in");
	fin >> N;
	fin.close();

	BigNum a = pow2(N*N);
	BigNum b = fact(N);
	
	a *= b;

	ofstream fout("patrate2.out");
	fout << a << endl;
	fout.close();

	return 0;
}