Pagini recente » Cod sursa (job #842554) | Cod sursa (job #2657092) | Cod sursa (job #2911055) | Cod sursa (job #2253439) | Cod sursa (job #2779450)
#include <bits/stdc++.h>
#define maxn 505
#define mod 666013
std::ifstream fin ("pedefe.in");
std::ofstream fout ("pedefe.out");
long long x1[maxn];
long long x2[maxn];
long long x3[maxn];
long long dp[2][maxn][maxn];
long long sum[maxn];
long long bit[maxn];
inline long long modul (long long x){
if (x >= mod)
x -= mod;
return x;
}
void update (long long *arr, long long pos, long long val){
if (val == 0)
return;
while (pos < maxn){
arr[pos] = modul (arr[pos] + val);
pos = (pos | (pos+1));
}
}
long long query (long long *arr, long long pos){
long long ans = 0;
while (pos >= 0){
ans = modul (ans + arr[pos]);
pos = (pos & (pos+1)) - 1;
}
return ans;
}
int main(){
int n1, n2, n3, i, j ,k, ii, jj, kk;
fin >> n1 >> n2 >> n3;
for (i=1; i<=n1; i++)
fin >> x1[i];
for (i=1; i<=n2; i++)
fin >> x2[i];
for (i=1; i<=n3; i++)
fin >> x3[i];
dp[0][0][0] = 1;
int crt = 1, ok = 1;
for (k=0; k<=n3; k++){
memset (sum, 0, sizeof sum);
memset (dp[1-crt], 0, sizeof dp[1-crt]);
for (i=1; i<=n1; i++){
memset (bit, 0, sizeof bit);
for (j=1; j<=n2; j++){
if (x1[i] == x2[j]){
if (x1[i] == x3[k+1])
dp[1-crt][i][j] = modul(dp[1-crt][i][j] + query (bit, x1[i]) + ok);
else
dp[crt][i][j] = modul(dp[crt][i][j] + query (bit, x1[i] + ok));
}
update (bit, x2[j], sum[j]);
sum[j] = modul(sum[j] + dp[crt][i][j]);
}
}
crt = 1-crt;
if (ok == 1) ok = 0;
}
/*
for (k=1; k<=n3; k++){
for (i=1; i<=n1; i++, fout << '\n')
for (j=1; j<=n2; j++)
fout << dp[k][i][j] << ' ';
fout << "**********\n";
}
*/
long long ans = 0;
for (i=1; i<=n1; i++)
for (j=1; j<=n2; j++)
ans = modul(ans + dp[1-crt][i][j]);
fout << ans % mod << '\n';
return 0;
}