HDU 1023 (高精度卡特兰)

卡特兰公式 f(n) = C(2 * n, n ) / n + 1

#include <iostream>
#include <vector>

using namespace std;

typedef long long LL;

const int N = 2000;

int prime[N], cnt[N], idx;

bool vis[N];


void get_prime()
{
	for (int i = 2; i <= 210; i++)
	{
		if (!vis[i])
		{
			prime[idx++] = i;
		}

		for (int j = 0; prime[j] <= 210 / i; j++)
		{
			vis[i * prime[j]] = true;

			if (i % prime[j] == 0) break;
		}
	}
}

int get(int a, int x)
{
	int res = 0;

	while (a)
	{
		res += a / x;
		a /= x;
	}
	return res;
}

vector<int> mul(vector<int> a, int b)
{
	int t = 0;

	vector<int> c;

	for (int i = 0; i < a.size(); i++)
	{
		t += a[i] * b;

		c.push_back(t % 10);

		t /= 10;
	}
	while (t) c.push_back(t % 10), t /= 10;

	return c;
}

vector<int> div(vector<int> a, int b)
{
	int t = 0;

	vector<int> c;
	bool flag = false;

	for (int i = a.size() - 1; i >= 0; i--)
	{
		t = t * 10 + a[i];

		int x = t / b;

		if (x || flag)
		{
			flag = true;
			c.push_back(x);
			t %= b;
		}

	}
	return c;
}
int main()
{
	int n;
	get_prime();
	while (cin >> n)
	{
	    //cout << idx << endl;
		for (int i = 0; i < idx; i++)
		{
			cnt[i] = get(2 * n, prime[i]) - get(n, prime[i]) * 2;
		}
		vector<int> res(1, 1);
		for (int i = 0; i < idx; i++)
		{
			//cout << i  << ' ' << cnt[i] << endl;
			for (int j = 0; j < cnt[i]; j++)
			{
				res = mul(res, prime[i]);
			}
		}
		res = div(res, n + 1);
            
		for (int i = 0; i < res.size(); i++) cout << res[i];

		cout << endl;
	}

    return 0;


}
发布了53 篇原创文章 · 获赞 14 · 访问量 1881

猜你喜欢

转载自blog.csdn.net/weixin_45630535/article/details/104933476