Pagini recente » Cod sursa (job #1241549) | Cod sursa (job #1753550) | Cod sursa (job #2258924) | Cod sursa (job #2009921) | Cod sursa (job #1402263)
#include<fstream>
#include<vector>
using namespace std;
typedef int var;
ifstream fin("culori.in");
ofstream fout("culori.out");
#define MAXN 280
#define P 9901
vector<var> POZ[MAXN];
var V[2*MAXN];
var DIN[2*MAXN][2*MAXN];
var lower(vector<var> &V, var val) {
var i, poz=0;
for(i=1; i<V.size(); i<<=1);
for(i>>=1;i;i>>=1) {
if(poz+i<V.size() && V[poz+i] <= val)
poz += i;
}
return poz;
}
int main() {
var n;
fin>>n;
for(var i=1; i<=n; i++) {
POZ[i].push_back(0);
}
for(var i=1; i<=2*n-1; i++) {
fin>>V[i];
POZ[V[i]].push_back(i);
}
for(var len=1; len<=2*n-1; len+=2) {
for(var b=1; b+len-1<=2*n-1; b++) {
var e = b+len-1;
//fout<<b<<" "<<e<<" : ";
if(b == e) DIN[b][e] = 1;
else if(V[b] != V[e]) DIN[b][e] = 0;
else {
//DIN[b][e] += DIN[b+1][e-1];
//DIN[b][e] %= P;
var p1 = lower(POZ[V[b]], b),
p2 = lower(POZ[V[b]], e);
//fout<<POZ[V[b]][p1]<<" "<<POZ[V[b]][p2];
if(p1 <= p2) {
var delta = p2-p1;
for(var i=(1<<delta)+1; i<(1<<(delta+1)); i+=2) {
var last = POZ[V[b]][p1];
var rez = 1;
for(var bit=1; bit<=delta; bit++) {
if(i & (1<<bit)) {
var p = POZ[V[b]][p1+bit];
rez *= DIN[last+1][p-1];
rez %= P;
last = p;
}
}
DIN[b][e] += rez;
DIN[b][e] %= P;
}
}
}
//fout<<endl;
}
}
fout<<DIN[1][2*n-1];
return 0;
}