Cod sursa(job #2959268)

Utilizator divadddDavid Curca divaddd Data 30 decembrie 2022 13:46:26
Problema Principiul includerii si excluderii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#define MOD 666013
#define MAX 200002
#define int long long
using namespace std;
int n,dp[MAX],e[MAX],fact[MAX];

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

int lgput(int n, int a){
    if(a == 0){
        return 1;
    }else{
        if(a%2 == 0){
            int val = lgput(n, a/2);
            return (val*val)%MOD;
        }else{
            return (n*lgput(n, a-1))%MOD;
        }
    }
}

int comb(int n, int m){
    return ((fact[n]*lgput(fact[m], MOD-2))%MOD*lgput(fact[n-m], MOD-2))%MOD;
}

signed main()
{
    fin >> n;
    e[1] = 0;
    fact[0] = 1;
    fact[1] = 1;
    for(int i = 2; i <= n; i++){
        e[i] = 1+e[i/2];
        fact[i] = (fact[i-1]*i)%MOD;
    }
    dp[0] = dp[1] = 1;
    for(int i = 2; i <= n; i++){
        int l = 0;
        int h = e[i];
        int ramas = i-((1<<h)-1);
        if(ramas >= (1<<(h-1))){
            l = (1<<h)-1;
        }else{
            l = ((1<<(h-1))-1)+ramas;
        }
        int r = (i-1)-l;
        dp[i] = ((comb(i-1, l) * dp[l])%MOD * dp[r])%MOD;
    }
    fout << dp[n];
    return 0;
}
/**
fie l = marimea sub-arborelui stang si
    r = marimea sub-arborelui drept
dp[n] = nr de max heap-uri cu n elemente

dp[0] = 0
dp[1] = 1
dp[n] = comb(n-1, l) * dp[l] * dp[r]
**/