Cod sursa(job #2507112)

Utilizator victoreVictor Popa victore Data 9 decembrie 2019 17:33:06
Problema Suma divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
//check check check
#include<iostream>
#include<vector>
#include<algorithm>
#include<fstream>
#include<queue>
#include<cstring>
#include<map>
#include<iomanip>
#include<set>

#define ll long long
#define pb(x) push_back(x)

using namespace std;

typedef pair<int,int> ii;

const int XMAX = 50005;
const int MOD = 997;
const int NMAX = 15;
const int KMAX = 55;

ifstream fin("calatorie1.in");
ofstream fout("calatorie1.out");

int dp[XMAX],catalan[XMAX],v[NMAX];
//dp[i] = numarul de moduri de a ajunge la (i,i)

bool mp[XMAX];

int pow2(int n,int e)
{
    int p = 1;
    while(e)
    {
        if(e&1)
            p = (p*n)%MOD;
        n = (n*n)%MOD;
        e>>=1;
    }

    return p;
}

int main()
{
    int i,j,X,N,K;
    fin>>X>>K;
    fin>>N;

    for(i = 1 ; i <= N ; ++i)
        fin>>v[i],mp[v[i]] = 1;

    //precalculez catalan
    catalan[1] = catalan[0] = 1;
    for(i = 2 ; i <= X ; ++i)
        catalan[i] =( ((2*(2*i-1)*catalan[i-1])%MOD) * pow2(i+1 , MOD-2) )%MOD;
    K>>=1;
    dp[0] = 1;
    for(i = 1 ; i <= X ; ++i)
    {
        if(mp[i])
            continue;
        for(j = max(i-K , 0) ; j < i ; ++j)
        {
            if(!mp[j])
                dp[i] = (dp[i] + 2*catalan[i-j-1]*dp[j])%MOD;
        }
    }

    fout<<dp[X];

    return 0;
}