Pagini recente » Cod sursa (job #1658313) | Cod sursa (job #2307954) | Cod sursa (job #146080) | Cod sursa (job #873172) | Cod sursa (job #611131)
Cod sursa(job #611131)
#include <stdio.h>
#include <string.h>
int n, m, p;
int v1[502], v2[502], v3[102];
int d1[502][502], d2[502][502], aib[502][502];
const int mod = 666013;
void update (int poz, int m, int val)
{
while (poz <= 500)
{
aib[poz][m] += val;
if (aib[poz][m] >= mod)
aib[poz][m] -= mod;
poz += poz & -poz;
}
}
int query (int poz, int m)
{
int val = 0;
while (poz)
{
val += aib[poz][m];
if (val >= mod)
val -= mod;
poz -= poz & -poz;
}
return val;
}
int main ()
{
freopen ("pedefe.in", "r", stdin);
freopen ("pedefe.out", "w", stdout);
scanf ("%d %d %d", &n, &m, &p);
int i, j, k, s;
for (i = 1; i <= n; i ++)
scanf ("%d", &v1[i]);
for (i = 1; i <= m; i ++)
scanf ("%d", &v2[i]);
for (i = 1; i <= p; i ++)
scanf ("%d", &v3[i]);
v1[0] = v1[0] = 1;
d1[0][0] = 1;
for (i = 1; i <= p + 1; i ++)
{
memcpy (d2, d1, sizeof (d1));
memset (d1, 0, sizeof (d1));
memset (aib, 0, sizeof (aib));
for (j = 0; j <= n; j ++)
{
s = 0;
for (k = 0; k <= m; k ++)
{
s += d2[j][k];
if (s >= mod)
s -= mod;
update (v1[j], k, s);
if (j >= n || k >= m)
continue;
if (v1[j + 1] == v2[k + 1] && v1[j + 1] == v3[i])
{
d1[j + 1][k + 1] += query (v1[j + 1], k);
if (d1[j + 1][k + 1] >= mod)
d1[j + 1][k + 1] -= mod;
}
else
if (v1[j + 1] == v2[k + 1])
{
d2[j + 1][k + 1] += query (v1[j + 1], k);
if (d2[j + 1][k + 1] >= mod)
d2[j + 1][k + 1] -= mod;
}
}
}
}
printf ("%d\n", query (500, m));
return 0;
}