Cod sursa(job #1877641)

Utilizator cameleonGeorgescu Dan cameleon Data 13 februarie 2017 17:03:12
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream>

using namespace std;
#define Nmax 200005
#define mod 666013

ifstream fin("permheap.in");
ofstream fout("permheap.out");
int n,i;
int d[Nmax],nr[Nmax],x,y,t,x1,y1;
int fact(int n){
    int p=1;
    for(int i=2;i<=n;i++)
        p=(1ll*p*i)%mod;
    return p;
}
void invers(int a, int b, int  &x, int &y)
{
    if(b==0){
        x=1;y=0;
    }
    else{
        int x0,y0;
        invers(b,a%b,x0,y0);
        x=y0;
        y=x0-(a/b)*y0;
    }
}
int main(){
    fin>>n;
    for(i=n;i>=1;i--){
        if(2*i>n)
            d[i]=1,nr[i]=1;
        else
            if(2*i+1>n)
                d[i]=d[2*i],nr[i]=nr[2*i]+1;
            else
            {
                nr[i]=nr[2*i]+nr[2*i+1]+1
                ;
                d[i]=(1ll*d[2*i]*d[2*i+1])%mod;
                y=nr[2*i];
                x=y+nr[2*i+1];
                d[i]=(d[i]*fact(x))%mod;
                t=(1ll*fact(y)*fact(x-y))%mod;
                invers(t,mod,x1,y1);
                if(x1<0)
                    x1=mod+x1%mod;
                d[i]=(d[i]*x1)%mod;

            }
    }
    fout<<d[1];
    return 0;
}