Cod sursa(job #1842625)

Utilizator giotoPopescu Ioan gioto Data 7 ianuarie 2017 13:00:02
Problema NextSeq Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.62 kb
#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;
}