Pagini recente » Cod sursa (job #2045962) | Cod sursa (job #2472717) | Cod sursa (job #1230571) | Cod sursa (job #2950887) | Cod sursa (job #2959268)
#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]
**/