Cod sursa(job #1004077)

Utilizator timicsIoana Tamas timics Data 2 octombrie 2013 00:24:11
Problema Pod Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

int N,M,K,v[1100],a[22][22],b[22][22],temp[22][22];

void mul(int A[22][22], int B[22][22])
{
    int C[22][22];
    for(int i=1;i<=K;++i)
        for(int j=1;j<=K;++j)
            C[i][j]=0;

    for(int i=1;i<=K;++i)
        for(int j=1;j<=K;++j)
            for(int k=1;k<=K;++k)
            {
                C[i][j]=(C[i][j] + A[i][k]*B[k][j])%9901;
            }

    for(int i=1;i<=K;++i)
        for(int j=1;j<=K;++j)
            B[i][j] = C[i][j];

    return;
}

void pow(int x, int A[22][22])
{
    int B[22][22];
    for(int i=1;i<=K;++i)
        for(int j=1;j<=K;++j)
            B[i][j]=A[i][j];

    if(x==1)
        return;

    pow(x/2,A);

    if(x%2==0)
        mul(A,A);

    else
    {
        mul(A,A);
        mul(B,A);
    }
}

int main()
{
    //freopen("input.in","r",stdin);
    freopen("pod.in","r",stdin);
    freopen("pod.out","w",stdout);
    cin>>N>>M>>K;
    for(int i=1;i<=M;++i)
        cin>>v[i];

    sort(v+1,v+M+1);

    for(int i=1;i<=K;++i)
    {
        b[i][K]=1;
        if(i==K)
            continue;
        a[i+1][i]=1;
    }
    a[1][1]=1;
    a[1][K]=1;

    for(int i=1;i<=K;++i)
        for(int j=1;j<=K;++j)
            temp[i][j]=a[i][j];



    if(!M)
    {
        if(N<K)
        {
            cout<<1;
            return 0;
        }
        pow(N-K+1,temp);
        mul(temp,b);
        cout<<b[1][K];
        return 0;
    }

    if(N<K)
    {
        cout<<0;
        return 0;
    }

    if(N==K && v[1]>K)
    {
        cout<<2;
        return 0;
    }

    int x=1;
    if(v[x]<K)
    {
        while(v[x]<K && x<=M)
        {
            b[K-v[x]][K]=0;
            ++x;
        }
    }

    if(v[x]==K && N==K)
    {
        cout<<0;
        return 0;
    }


    v[0] = K;

    for(int i=x;i<=M;++i)
    {
        pow(v[i]-v[i-1],temp);
        mul(temp,b);

        for(int i=1;i<=K;++i)
            for(int j=1;j<=K;++j)
                temp[i][j]=a[i][j];

        b[1][K]=0;
    }

    pow(N-v[M],temp);
    mul(temp,b);

    cout<<b[1][K];
    return 0;
}