Cod sursa(job #16963)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 14 februarie 2007 16:42:16
Problema Pedefe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>

#define MAXN 501
#define MAXP 101
#define MOD 666013

int N, M, P;
int a[MAXN], b[MAXN], c[MAXP];
int nr[2][MAXN][MAXN];

//numarul de subsiruri crescatoare comune pentru 2 siruri
//avand un al treilea ca subsir

int main()
{
	freopen("pedefe.in", "rt", stdin);
	freopen("pedefe.out", "wt", stdout);
	
	scanf("%d %d %d", &N, &M, &P);
	a[0] = b[0] = c[0] = 0;		//numerele sunt in intervalul [1...500]
	for (int i = 1; i <= N; i++)
		scanf("%d", a + i);
	for (int j = 1; j <= M; j++)
		scanf("%d", b + j);
	for (int k = 1; k <= P; k++)
		scanf("%d", c + k);

	//nr[k][i][j] = nr de subsiruri care contin primele k valori din c, si se termina la pozitiile i in sirul a si j in sirul b (a[i] == b[j])
	
	nr[0][0][0] = 1;
	int step = 1;
	for (int k = 1; k <= P; k++, step ^= 1)
		for (int i = 1; i <= N; i++)
			for (int j = 1; j <= M; j++)
			{
				nr[step][i][j] = 0;
				if (a[i] != b[j])
					continue;
				if (a[i] < c[k])
					continue;

				int x, y;
				for (x = 0; x < i; x++)
					for (y = 0; y < j; y++)
					{
						if (a[x] != b[y])
							continue;
						if (a[x] > a[i])
							continue;

						if (a[i] == c[k])
						{
							nr[step][i][j] += nr[1 ^ step][x][y];
							if (nr[step][i][j] >= MOD)
								nr[step][i][j] -= MOD;
						}
						else
						{
							nr[step][i][j] += nr[step][x][y];
							if (nr[step][i][j] >= MOD)
								nr[step][i][j] -= MOD;
						}
					}
			}

	int S = 0;
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= M; j++)
			if (a[i] == b[j])
			{
				S += nr[1 ^ step][i][j];
				if (S >= MOD)
					S -= MOD;
			}
	printf("%d\n", S);
	return 0;
}