Pagini recente » Cod sursa (job #880631) | Cod sursa (job #2945483) | Cod sursa (job #1775002) | Cod sursa (job #2021988) | Cod sursa (job #592095)
Cod sursa(job #592095)
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 510
#define mod 666013
int n, m, p, i, j, k, x, sum;
int a[maxn], b[maxn], c[maxn], d[2][maxn][maxn], aib[maxn][maxn];
inline int lsb(int x)
{
return (x&(x-1))^x;
}
void update(int aib[], int poz, int val)
{
while(poz<maxn)
{
aib[poz]+=val;
if(aib[poz]>=mod)
aib[poz]-=mod;
poz+=lsb(poz);
}
}
int query(int aib[], int poz)
{
int sol=0;
while(poz)
{
sol+=aib[poz];
if(sol>=mod)
sol-=mod;
poz-=lsb(poz);
}
return sol;
}
int main()
{
freopen("pedefe.in", "r", stdin);
freopen("pedefe.out", "w", stdout);
scanf("%d%d%d", &n, &m, &p);
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]);
d[1][0][0]=1;
a[0]=b[0]=1;
for(int k=0; k<=p; ++k)
{
memset(aib, 0, sizeof(aib));
for(int i=0; i<=n; ++i)
for(int j=0; j<=m; ++j)
{
d[0][i][j]=d[1][i][j];
d[1][i][j]=0;
}
for(int i=0; i<=n; ++i)
{
sum=0;
for(int j=0; j<=m; ++j)
{
sum+=d[0][i][j];
if(sum>=mod)
sum-=mod;
if(sum>0)
update(aib[j], a[i], sum);
if(i<n && j<m && a[i+1]==b[j+1])
{
x=0;
if(a[i+1]==c[k+1])
x=1;
d[x][i+1][j+1]+=query(aib[j], a[i+1]);
if(d[x][i+1][j+1]>=mod)
d[x][i+1][j+1]-=mod;
}
}
}
}
printf("%d\n", query(aib[m], maxn-1));
return 0;
}