Pagini recente » Cod sursa (job #214292) | Cod sursa (job #3155607) | Cod sursa (job #417604) | Cod sursa (job #3170895) | Cod sursa (job #3300865)
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<cstdio>
constexpr int NMAX=512, MOD=666013;
int N, M, P;
int S1[NMAX];
int S2[NMAX];
int S3[NMAX];
int dp[2][NMAX][NMAX];
int sp[NMAX][NMAX];
inline void reduce(int& x)
{
while(x<0)
x+=MOD;
while(x>=MOD)
x-=MOD;
}
inline void computeSp(int i, int j)
{
if(i && j)
sp[i][j]+=sp[i-1][j]+sp[i][j-1]-sp[i-1][j-1];
else if(i)
sp[i][j]+=sp[i-1][j];
else if(j)
sp[i][j]+=sp[i][j-1];
reduce(sp[i][j]);
}
int runDp()
{
int i, j, k, last=0, prev=0, curr=1;
bool ok;
dp[0][0][0]=1;
for(k=1;k<NMAX;++k)
{
ok=0;
while(last<P && S3[last]==k)
{
++last;
sp[0][0]=dp[prev][0][0];
for(j=1;j<=M;++j)
{
sp[0][j]=sp[0][j-1]+dp[prev][0][j];
reduce(sp[0][j]);
}
for(i=1;i<=N;++i)
{
sp[i][0]=sp[i-1][0]+dp[prev][i][0];
reduce(sp[i][0]);
for(j=1;j<=M;++j)
{
sp[i][j]=sp[i-1][j]+sp[i][j-1]-sp[i-1][j-1]+dp[prev][i][j];
reduce(sp[i][j]);
}
}
ok=1;
for(i=0;i<=N;++i)
for(j=0;j<=M;++j)
dp[curr][i][j]=0;
for(i=0;i<N;++i)
for(j=0;j<M;++j)
if(S1[i]==k && S2[j]==k)
dp[curr][i+1][j+1]=sp[i][j];
prev=curr;
curr=!curr;
}
if(!ok)
{
for(i=0;i<=N;++i)
for(j=0;j<=M;++j)
dp[curr][i][j]=0;
for(i=0;i<=N;++i)
for(j=0;j<=M;++j)
{
dp[curr][i][j]+=dp[prev][i][j];
while(dp[curr][i][j]>=MOD)
dp[curr][i][j]-=MOD;
sp[i][j]=dp[curr][i][j];
computeSp(i, j);
if(S1[i]==k && S2[j]==k)
{
dp[curr][i+1][j+1]+=sp[i][j];
while(dp[curr][i+1][j+1]>=MOD)
dp[curr][i+1][j+1]-=MOD;
}
}
prev=curr;
curr=!curr;
}
// printf("k=%d\n", k);
// for(i=0;i<=N;++i)
// {
// for(j=0;j<=M;++j)
// printf("%d ", dp[prev][i][j]);
// printf("\n");
// }
// printf("\n");
}
return sp[N][M];
}
int main()
{
FILE* f=fopen("pedefe.in", "r"), *g=fopen("pedefe.out", "w");
// FILE* f=stdin, *g=stdout;
int i;
fscanf(f, "%d%d%d", &N, &M, &P);
for(i=0;i<N;++i)
fscanf(f, "%d", S1+i);
for(i=0;i<M;++i)
fscanf(f, "%d", S2+i);
for(i=0;i<P;++i)
fscanf(f, "%d", S3+i);
fprintf(g, "%d\n", runDp());
fclose(f);
fclose(g);
return 0;
}