Pagini recente » Cod sursa (job #2987502) | Cod sursa (job #1074192) | Cod sursa (job #1729380) | Cod sursa (job #1112166) | Cod sursa (job #1842625)
#include <cstdio>
#include <algorithm>
#define MOD 100000000
using namespace std;
int n, m, p, a[10001], x[10001], y[10001], st[10001], st2[10001];
long long s1[1001], s2[1001], p2[1001], aux[1001];
int main()
{
freopen("nextseq.in", "r", stdin);
freopen("nextseq.out", "w", stdout);
scanf("%d%d%d", &n, &m, &p);
for(int i = 1; i <= n ; ++i)
scanf("%d", &a[i]);
for(int i = 1; i <= m ; ++i)
scanf("%d", &x[i]);
for(int i = 1; i <= p ; ++i)
scanf("%d", &y[i]);
sort(a + 1, a + n + 1);
int k = 1;
while(k <= m){
int p = 1, dr = n;
while(p <= dr){
int mij = (p + dr) / 2;
if(a[mij] > x[k]) dr = mij - 1;
else if(a[mij] < x[k]) p = mij + 1;
else {st[k] = mij; break;}
}
++k;
}
k = 1;
while(k <= p){
int st = 1, dr = n;
while(st <= dr){
int mij = (st + dr) / 2;
if(a[mij] > y[k]) dr = mij - 1;
else if(a[mij] < y[k]) st = mij + 1;
else {st2[k] = mij; break;}
}
++k;
}
p2[0] = p2[1] = s1[0] = 1;
for(int t = m; t >= 1 ; --t){
long long T = 0;
aux[0] = p2[0];
for(int i = 1; i <= p2[0]; ++i){
aux[i] = p2[i] * st[t] + T;
T = aux[i] / MOD;
aux[i] %= MOD;
}
while(T){
aux[++aux[0]] = T % MOD;
T = T / MOD;
}
if(aux[0] > s1[0]) s1[0] = aux[0];
for(int i = 1; i <= aux[0] ; ++i){
s1[i] = s1[i] + aux[i] + T;
T = s1[i] / MOD;
s1[i] = s1[i] % MOD;
}
int j = aux[0];
if(T) s1[++j] += T;
if(j > s1[0]) s1[0] = j;
T = 0;
for(int i = 1; i <= p2[0] ; ++i){
p2[i] = p2[i] * n + T;
T = p2[i] / MOD;
p2[i] %= MOD;
}
while(T){
p2[++p2[0]] = T % MOD;
T /= MOD;
}
}
p2[0] = 1; p2[1] = 1; st2[1] = 1;
for(int t = p; t >= 1 ; --t){
long long T = 0;
aux[0] = p2[0];
for(int i = 1; i <= p2[0]; ++i){
aux[i] = p2[i] * st2[t] + T;
T = aux[i] / MOD;
aux[i] %= MOD;
}
while(T){
aux[++aux[0]] = T % MOD;
T = T / MOD;
}
if(aux[0] > s2[0]) s2[0] = aux[0];
for(int i = 1; i <= aux[0] ; ++i){
s2[i] = s2[i] + aux[i] + T;
T = s2[i] / MOD;
s2[i] = s2[i] % MOD;
}
int j = aux[0];
if(T) s2[++j] += T;
if(j > s2[0]) s2[0] = j;
T = 0;
for(int i = 1; i <= p2[0] ; ++i){
p2[i] = p2[i] * n + T;
T = p2[i] / MOD;
p2[i] %= MOD;
}
while(T){
p2[++p2[0]] = T % MOD;
T /= MOD;
}
}
long long T = 0;
for(int i = 1; i <= s2[0] ; ++i){
s2[i] = s2[i] - s1[i] - T;
if(s2[i] < 0) s2[i] += MOD, T = 1;
else T = 0;
}
while(s2[s2[0]] == 0) --s2[0];
--s2[1];
if(s2[1] < 0) s2[1] += MOD, T = 1;
else T = 0;
int j = 2;
while(T){
s2[j] -= T;
if(s2[j] < 0) s2[j] += MOD;
else T = 0;
++j;
}
while(s2[s2[0]] == 0) --s2[0];
printf("%d", s2[s2[0]]);
for(int i = s2[0] - 1; i >= 1 ; --i){
if(s2[i] == 0) {printf("00000000"); continue;}
long long aux = s2[i];
while(aux < MOD / 10) aux *= 10;
printf("0");
printf("%d", s2[i]);
}
return 0;
}