HDU 1023 Train Problem II

大數 卡特蘭數


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <math.h>

using namespace std;

#define sf scanf
#define pf printf
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define dbg(x) cerr << "Line:" <<  __LINE__ << " : " << #x << " = " << (x) << endl
#define nMax 1000
#define ll long long
#define CLR(a) memset((a),0,sizeof((a)))

struct BigNum {
	int a[nMax];
	int n;

	void clear() { CLR(a); n=0; }
	int& operator [](int i) { return (int&) a[i]; }
	//const int& operator [](int i) { return (const int&)this->a[i]; }
	void fresh() {
		int add = 0;
		rep(i,n) {
			 add += a[i];
			 a[i] = add%10;
			 add = add/10;
		}
		while(add) {
			a[n] = add%10;
			add /= 10;
			n ++;
		}
	}
	void out() {
		for(int i=n-1;i>=0;i--) pf("%d",a[i]);
		pf("\n");
	}
};

BigNum operator * (BigNum a,int k) {
	BigNum ret;ret.clear();
	ret.n = a.n;
	rep(i,a.n) ret[i]=a[i]*k;
	ret.fresh();
	return ret;
}
BigNum operator / (BigNum a,int k) {
	BigNum ret;ret.clear();
	ret.n = a.n;
	int add = 0;
	for(int i=a.n-1;i>=0;i--) {
		add = add*10 + a[i];
		ret[i] = add/k;
		add %= k;
	}
	while(ret.n>=1 && ret[ret.n-1]==0) ret.n --;
	return ret;
}

BigNum temp[101],tmp;
void init(int n){
	temp[0].clear();
	temp[0][0]=1;temp[0].n=1;
	for(int i=1;i<n;i++) {
		tmp = temp[i-1]*(2*(2*i-1));
		//tmp.out();
		temp[i] = tmp / (i+1);
	}
}	



int main() {
#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
#endif

	init(101);
	int n;
	while(cin >> n) {
		temp[n].out();
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章