Cod sursa(job #3300863)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 19 iunie 2025 16:19:10
Problema Pedefe Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
// 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];
				}

			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;
}