Pagini recente » Cod sursa (job #2338628) | Cod sursa (job #1898310) | Cod sursa (job #335899) | Cod sursa (job #1180567) | Cod sursa (job #18537)
Cod sursa(job #18537)
#include <stdio.h>
#include <stdlib.h>
#define nmax 260
int a[nmax],min[nmax],max[nmax],n,i,j,nr,k,v,b[nmax];
long r;
int compare(const void *x,const void *y)
{
return *(int*)y-*(int*)x;
}
FILE *f,*g;
int main()
{
f=fopen("culori.in","rt");
g=fopen("culori.out","wt");
fscanf(f,"%d",&n);
nr=n;
for (i=1;i<2*n;i++)
fscanf(f,"%d",&a[i]);
if (a[1]!=a[2*n-1])
{
fprintf(g,"0\n");
fclose(f);
fclose(g);
return 0;
}
for (i=1;i<2*n-1;i++)
{
j=i;
while (a[j]==a[j+1])
j++;
if (j==i)
{
min[a[i]]=1;
max[a[i]]+=1;
}
else
{
min[a[i]]=2;
max[a[i]]+=j-i+1;
i=j;
}
}
min[a[1]]--;
max[a[1]]--;
nr=n-1;
j=1;
for (i=1;i<=n&&nr>=0;i++)
{
nr-=min[i];
j+=max[i];
max[i]-=min[i];
}
if (nr<0||j<n-1)
{
fprintf(g,"0\n");
fclose(f);
fclose(g);
return 0;
}
else
{
qsort(max+1,n,sizeof(int),compare);
i=1;
while (max[i+1])
i++;
n=i;
for (i=1;i<=n;i++)
if (max[i]>nr)
max[i]=nr;
k=1;
b[1]=-1;
j=-1;
while (k>0)
{
v=0;
while (v==0&&b[k]<max[k])
{
b[k]++;
j++;
v=1;
}
if (!v)
{
j-=b[k];
k--;
}
else
{
if (j==nr)
r++;
else
if (k<n)
{
k++;
j--;
b[k]=-1;
}
}
}
}
fprintf(g,"%ld\n",r%9901);
fclose(f);
fclose(g);
return 0;
}