BZOJ1925【动态规划】【组合数学】

用奇怪的姿势做出来了.

/* I will wait for you */  
  
#include <cstdio>  
#include <cstdlib>  
#include <cstring>  
#include <cmath>  
#include <ctime>  
#include <algorithm>  
#include <iostream>  
#include <fstream>  
#include <vector>  
#include <queue>  
#include <deque>  
#include <set>  
#include <map>  
#include <string>  
#define make make_pair  
#define fi first  
#define se second  
  
using namespace std;  
  
typedef long long ll;  
typedef unsigned long long ull;  
typedef pair<int, int> pii;  
  
const int maxn = 5010;  
const int maxm = 100010;  
const int maxs = 26;  
const int inf = 0x3f3f3f3f;  
const int P = 1000000007;  
const double error = 1e-9;  
  
inline int read()  
{  
    int x = 0, f = 1;  
    char ch = getchar();  
    while (ch < '0' || ch > '9')  
          f = (ch == '-' ? -1 : 1), ch = getchar();  
    while (ch >= '0' && ch <= '9')  
          x = x * 10 + ch - '0', ch = getchar();  
    return x * f;  
}  

int f[maxn][2];
vector<int> c[maxn];

int main()
{
	int n = read(), P = read();

	for (int i = 0; i <= n; i++)
		for (int j = 0; j <= i + 1; j++)
			c[i].push_back(0);

	for (int i = 0; i <= n; i++)
		c[i][0] = 1;
	
	for (int i = 1; i <= n; i++)	 
		for (int j = 1; j <= i; j++)
			c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % P;
	
	f[0][0] = f[0][1] = f[1][0] = f[1][1] = 1;
	
	for (int i = 2; i <= n; i++)
		for (int j = 0; j <= i - 1; j++) {
			f[i][(i - j) & 1] += (ll) c[i - 1][j] * f[j][0] 
				% P * f[i - 1 - j][0] % P;
			f[i][(i - j) & 1] %= P;
		}
	
	printf("%d\n", (f[n][0] + f[n][1]) % P);
	
	return 0;
}


你可能感兴趣的:(BZOJ1925【动态规划】【组合数学】)