Pagini recente » Cod sursa (job #494297) | Cod sursa (job #2082740) | Mihnea Andreescu | Borderou de evaluare (job #1036273) | Cod sursa (job #16963)
Cod sursa(job #16963)
#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;
}