#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;
}
HDU 1223(Order Count)
猜你喜欢
转载自blog.csdn.net/Intelligence1028/article/details/104661949
今日推荐
周排行