Pagini recente » Cod sursa (job #1560761) | Cod sursa (job #2648686) | Cod sursa (job #1880428) | Cod sursa (job #2141774) | Cod sursa (job #1838586)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define MAXN 256
#define MAXSIZE 512
#define MOD 9901
using namespace std;
int culori[MAXSIZE + 1];
vector <int> P[MAXN + 1];
int ind[MAXSIZE + 1];
int D[MAXSIZE + 1][MAXSIZE + 1];
int aup;
inline int sumMOD(int a, int b) {
return a + b - ((a + b) >= MOD ? MOD : 0);
}
inline int prodMOD(int a, int b) {
aup = a * b;
if (aup >= MOD)
aup %= MOD;
return aup;
}
int solve(int st, int dr) {
if (D[st][dr] != -1)
return D[st][dr];
if (culori[st] != culori[dr])
return D[st][dr] = 0;
if ((dr - st) & 1)
return D[st][dr] = 0;
if (st == dr)
return D[st][dr] = 1;
int cul = culori[st], pst = ind[st], pdr = ind[dr];
D[st][dr] = solve(st + 1, dr - 1);
for (int i = pst + 1 ; i < pdr ; ++i)
D[st][dr] = sumMOD(D[st][dr], prodMOD(solve(st + 1, P[cul][i] - 1), solve(P[cul][i], dr)));
return D[st][dr];
}
int main () {
ifstream cin("culori.in");
ofstream cout("culori.out");
int n;
cin >> n;
for (int i = 1 ; i < (2 * n) ; ++i) {
cin >> culori[i];
P[culori[i]].push_back(i);
ind[i] = P[culori[i]].size() - 1;
}
memset(D, -1, sizeof(D));
cout << solve(1, (2 * n) - 1) << "\n";
return 0;
}