Cod sursa(job #637690)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 20 noiembrie 2011 15:58:12
Problema Ciuperci Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 2.13 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in ("ciuperci.in");
ofstream out ("ciuperci.out");

int k;
long long rez;

long long putere(long long n)
{
    long long i;
    k=0;
    for(i=1;i*2-1<=n;i*=2)
    {
        k++;
    }
    return i-1;
}


int putere2(long long k)
{
    int x;
    if(k==0)
        return 1;
    if(k%2==0)
    {
        x=putere2(k/2);
        return (((long long) x)* x)%666013;
    }
    x=putere2(k/2);
    return (((long long)(((long long) x*x)%666013)*2))%666013;
}
int putere3(int n, long long k)
{
    int x;
    if(k==0)
        return 1;
    if(k%2==0)
    {
        x=putere3(n,k/2);
        return ((((long long) x)*x)%666013);
    }
    x=putere3(n,k/2);
    return (((long long) (((long long) x*x)%666013))*n)%666013;
}

void arbore(long long p, long long nrp, long long ip, long long nrip, int niv)
{
    long long par=0,impar=0;
    long long nrpar=0,nrimpar=0;
    if(p==0 && ip==1)
    {
        //rez=(((long long) putere3(putere2(k-niv+1),nrip))*rez)%666013;
        rez+=(k-niv+1)*nrip;
        return;
    }
    if((p/2)%2==0)
    {
        par=p/2;
        nrpar=nrp*2;
    }
    else
    {
        impar=p/2;
        nrimpar=nrp*2;
    }
    if(nrip!=0)
    {
        if((ip/2)%2==0)
        {
            impar=ip/2+1;
            nrimpar+=nrip;
            par=ip/2;
            nrpar+=nrip;
        }
        else
        {
            impar=ip/2;
            nrimpar+=nrip;
            par=ip/2+1;
            nrpar+=nrip;
        }
    }
    //rez=(((long long) putere2(nrip))*rez)%666013;
    rez+=nrip;
    arbore(par,nrpar,impar,nrimpar,niv+1);
    return;
}


int main()
{
    int t,i;
    long long n, m;
    in>>t;
    for(i=1;i<=t;++i)
    {
        //rez=1;
        rez=0;
        in>>n;
        m=n-putere(n);
        if(m==0)
        {
            out<<"1\n";
            continue;
        }
        if(m%2==0)
            arbore(m,1,0,0,1);
        else
            arbore(0,0,m,1,1);
        //out<<rez<<"\n";
        out<<putere2(rez)<<"\n";
    }
    return 0;
}