Pagini recente » Clasament ioi2013trainingcamp | redsnow_3 | Monitorul de evaluare | Arhiva de probleme | Cod sursa (job #2007883)
#include<fstream>
#define mod 666013
#define nmax 200001
using namespace std;
fstream f1("permheap.in", ios::in);
fstream f2("permheap.out", ios::out);
long int n, siz[nmax], d[nmax];
long int putere(long long int a, long int b)
{
long long int rez=1;
while(b>0)
{
if(b&1) {b--; rez*=a; rez%=mod;}
b/=2;
a*=a;
a%=mod;
}
return rez;
}
long int c(long int n, long int k)
{
///calc n!* inv(k!) * inv((n-k)!)
///inv(k!)= k!^(mod-2), mod prim
///inv((n-k)!)= (n-k)!^(mod-2)
long long int i, v1=1, v2=1, v3=1;
for(i=2; i<=n; i++)
{
v1*=i;
v1%=mod;
}
for(i=2; i<=k; i++)
{
v2*=i;
v2%=mod;
}
v2=putere(v2, mod-2);
v1*=v2;v1%=mod;
for(i=2; i<=n-k; i++)
{
v3*=i;
v3%=mod;
}
v3=putere(v3, mod-2);
v1*=v3;v1%=mod;
return v1;
}
int main()
{
long int i, comb;
f1>>n;
for(i=1; i<=n; i++)
siz[i]=1;
for(i=n; i>1; i--)
siz[i/2]+=siz[i];
for(i=n; i>=1; i--)
{
if(siz[i]==1) d[i]=1;///nod terminal
else if(i*2==n) d[i]=d[i*2]; ///nod cu un fiu
else ///nod cu 2 fii
{
comb=c(siz[2*i]+siz[2*i+1], siz[2*i]);
d[i]= ((d[2*i] * d[2*i+1])%mod * comb) %mod;
}
}
f2<<d[1];
return 0;
}