HDU 1223(Order Count)

#include <iostream>
#include <cstring>
using namespace std;
const int MAX = 505;

struct BigNum //大数
{
	int num[MAX];
	int len;
}big[55][55];

//大数加法
BigNum Add(BigNum& a, BigNum& b)
{
	BigNum c;
	memset(c.num, 0, sizeof(c.num));
	int len = (a.len > b.len) ? a.len : b.len;
	for (int i = 0; i < len; i++)
	{
		c.num[i] += (a.num[i] + b.num[i]);
		if (c.num[i] >= 10)
		{
			c.num[i + 1]++;
			c.num[i] -= 10;
		}
	}
	if (c.num[len])
		++len;
	c.len = len;
	return  c;
}

//大数乘法
BigNum mul(BigNum& a, int& b)
{
	BigNum c;
	int len = a.len;
	memset(c.num, 0, sizeof(c.num));
	if (b == 0)
	{
		c.len = 1;
		return  c;
	}
	for (int i = 0; i < len; i++)
	{
		c.num[i] += (a.num[i] * b);
		if (c.num[i] >= 10)
		{
			c.num[i + 1] = c.num[i] / 10;
			c.num[i] %= 10;
		}
	}
	while (c.num[len] > 0)
	{
		c.num[len + 1] = c.num[len] / 10;
		c.num[len++] %= 10;
	}
	c.len = len;
	return  c;
}

//初始化
void init()
{
	for (int i = 0; i <= 50; i++)
	{
		for (int j = 0; j <= 50; j++)
		{
			if (i < j || j == 0)
			{
				big[i][j].num[0] = 0;
				big[i][j].len = 1;
			}
			else if (j == 1)
			{
				big[i][j].num[0] = 1;
				big[i][j].len = 1;
			}
			else
			{
				big[i][j] = Add(big[i - 1][j], big[i - 1][j - 1]);
				big[i][j] = mul(big[i][j], j);
			}
		}
	}
}

int main()
{
	init();
	int P;
	int n;
	BigNum sum;
	cin >> P;
	while (P--)
	{
		memset(sum.num, 0, sizeof(sum.num));
		sum.len = 0;
		cin >> n;
		for (int i = 1; i <= n; i++)
			sum = Add(sum, big[n][i]);
		for (int i = sum.len - 1; i >= 0; i--)
			cout << sum.num[i];
		cout << endl;
	}
	return 0;
}
发布了152 篇原创文章 · 获赞 1 · 访问量 7626

猜你喜欢

转载自blog.csdn.net/Intelligence1028/article/details/104661949