Pagini recente » Cod sursa (job #1429449) | Cod sursa (job #2608675) | Cod sursa (job #1775827) | Cod sursa (job #1892132) | Cod sursa (job #2779434)
#include <bits/stdc++.h>
using namespace std;
const int MOD(666013), NMAX(505);
int dp[2][NMAX][NMAX], s1[NMAX], s2[NMAX], s3[NMAX]; ///dp[k][i][j] (S3, S1, S2) = nr de subsiruri comune crescatoare cu elemente din 1...i din S1, 1...j din S2, contine primele k elemente din S3 si se termina cu valoare S1[i]
inline int modul(int val){
if(val > MOD)
val -= MOD;
return val;
}
int main()
{
freopen("pedefe.in", "r", stdin);
freopen("pedefe.out", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n, m, p;
cin >> n >> m >> p;
for(int i = 1; i <= n; ++i)
cin >> s1[i];
for(int i = 1; i <= m; ++i)
cin >> s2[i];
for(int i = 1; i <= p; ++i)
cin >> s3[i];
int cur = 1, last = 0, care = -1;
dp[1][0][0] = 1;
for(int k = 0; k <= p; ++k)
{
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
if(s1[i] == s2[j])
{
if(s1[i] == s3[k] && k)
care = last;
else
care = cur;
for(int ax1 = 0; ax1 < i; ++ax1)
for(int ax2 = 0; ax2 < j; ++ax2)
if(s1[ax1] <= s1[i])
dp[cur][i][j] = modul(dp[cur][i][j] + dp[care][ax1][ax2]);
}
for(int i = 0; i <= n; ++i)
for(int j = 0; j <= m; ++j)
dp[last][i][j] = 0;
swap(last, cur);
}
int rez = 0;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
rez = modul(rez + dp[last][i][j]);
cout << rez << '\n';
return 0;
}