rt.
#include <iostream>
#include <cstring>
using namespace std;
class bigint
{
public:
bigint()
{
length = 0;
memset(num, 0, sizeof(num));
}
int num[1005];
int length;
int& operator[](unsigned int i)
{
return num[i];
}
bigint operator +(const bigint &a)
{
bigint ans;
int mxl = max(length, a.length);
for(int i = 1; i <= mxl; i++)
{
ans[i] += num[i] + a.num[i];
if(i == mxl && ans[i] >= 10) mxl++;
ans[i + 1] += ans[i] / 10;
ans[i] %= 10;
}
ans.length = mxl;
return ans;
}
bigint operator *(const int &a)
{
bigint ans;
int mxl = length;
for(int i = 1; i <= mxl; i++)
{
ans[i] += num[i] * a;
ans[i + 1] += ans[i] / 10;
ans[i] %= 10;
}
while(ans.num[mxl + 1] > 0)
{
mxl++;
ans[mxl + 1] = ans[mxl] / 10;
ans[mxl] %= 10;
}
ans.length = mxl;
return ans;
}
friend ostream& operator << (ostream& os, const bigint &n)
{
for(int i = n.length; i >= 1; i--)
{
os << n.num[i];
}
os << endl;
return os;
}
};
bigint dp[105][105];
int main()
{
int n, m;
for(int i = 1; i <= 100; i++)
{
for(int j = 1; j <= 100; j++)
{
if(j == 1)
{
dp[i][j].length = 1;
dp[i][j].num[1] = 1;
}
else
{
bigint mul = dp[i - 1][j] * j;
bigint add = dp[i - 1][j - 1] + mul;
dp[i][j] = add;
}
}
}
while(cin >> n >> m)
{
cout << dp[n][m];
}
return 0;
}