Cod sursa(job #2007883)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 4 august 2017 14:06:45
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#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;
}