Cod sursa(job #466968)

Utilizator rusu_raduRusu Radu rusu_radu Data 28 iunie 2010 10:07:28
Problema Pod Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 1.38 kb
#include <cstdio>
#include <cassert>
#include <algorithm>
#include <cmath>
#define Nmax 1005
#define mod 9901
#define InFile "pod.in"
#define OutFile "pod.out"

using namespace std;

int n, m, k;
int T[Nmax], Sc[Nmax];

void read();
void solve();
void write();
int binara (int x);

int main()
{
    assert (freopen (InFile, "r", stdin));
    assert (freopen (OutFile, "w", stdout));
    read();
    sort (Sc, Sc+m);
    solve();
    write();
    return 0;
}

void read()
{
    int i;
    scanf("%d %d %d\n", &n, &m, &k);
    for (i=0; i<m; i++)
        scanf("%d ", &Sc[i]);
}

void solve ()
{
    int i, rez, poz, r;
    T[0]=1;
    for (i=1; i<=n; i++)
    {
        //caz in care fac un pas
        rez=0;
        poz=(i%1000-1)>=0?i%1000-1:1000-1;
        r=binara(poz);
        if (r==-1) rez=(rez+T[poz])%mod;

        //caz in care fac k pasi
        poz=(i%1000-k)>=0?i%1000-k:1000-(int)abs(i%1000-k);
        r=binara (poz);
        if (r==-1) rez=(rez+T[poz])%mod;
        T[i%1000]=rez;
    }

}

int binara(int x)
{
    int st=0, dr=m-1, mij;
    while (st<=dr)
    {
        mij=st+(dr-st)/2;
        if (Sc[mij]==x)
            return mij;
        else
            if (Sc[mij]>x)
                dr=mij-1;
            else
                st=mij+1;
    }
    return -1;
}

void write()
{
    printf ("%d\n", T[n%1000]);
}