Cod sursa(job #1843149)

Utilizator mihai.alphamihai craciun mihai.alpha Data 8 ianuarie 2017 12:01:47
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>


FILE *fi, *fo;
#define MAXN 1000003
#define MOD 666013

int v[MAXN], lista[MOD], next[MAXN];

void adauga( long long x, int p ) {
    v[p] = x;
    next[p] = lista[x%MOD];
    lista[x%MOD] = p;
}
void sterge( long long x ) {
    int p;
    p = lista[x%MOD];
    if ( v[p] == x )
        lista[x%MOD] = next[p];
    else {
        while ( v[next[p]] != x && next[p] != 0 )
            p = next[p];
        if ( v[next[p]] == x )
            next[p] = next[next[p]];
    }
}
bool cauta(long long x) {
    int p;
    p = lista[x%MOD];
    while ( p != 0 && v[p] != x )
        p = next[p];
    return v[p] == x;
}

long long N, M;
long long A, B, C, D, E;
long long V;

int main()  {
    fi = fopen("muzica.in", "r");
    fo = fopen("muzica.out", "w");
    fscanf(fi, "%lld%lld", &N, &M);
    fscanf(fi, "%lld%lld%lld%lld%lld", &A, &B, &C, &D, &E);
    for(int i = 1;i <= N;i++)  {
        fscanf(fi, "%d", &V);
        adauga(V, i);
    }
    long long a1, a2;
    a1 = A;
    a2 = B;
    int rez = 0;
    rez += cauta(a1);
    sterge(a1);
    rez += cauta(a2);
    sterge(a2);
    for(int i = 3;i <= M && rez <= N;i++)  {
        long long Cur;
        Cur = ((C * a2 + D * a1)) % E;
        if(cauta(Cur))  {
            rez++;
            sterge(Cur);
        }
        a1 = a2;
        a2 = Cur;
    }
    fprintf(fo, "%d", rez);
    fclose(fi);
    fclose(fo);
    return 0;
}