Cod sursa(job #1291805)

Utilizator Athena99Anghel Anca Athena99 Data 13 decembrie 2014 11:58:50
Problema Ciuperci Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <vector>

using namespace std;

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

typedef long long i64;

const int mod= 666013;
const int modh= 25007;

struct str {
    i64 x;
    int y;
};

inline str mp( i64 x, int y ) {
    str sol;
    sol.x= x, sol.y= y;
    return sol;
}

vector <str> v[modh];

int check( i64 x ) {
    int p= -1;
    for ( int i= 0; i<(int)v[x%modh].size() && p==-1; ++i ) {
        if ( v[x%modh][i].x==x ) {
            p= v[x%modh][i].y;
        }
    }

    return p;
}

int query( i64 x ) {
    int p1= check(x/2), p2;
    if ( p1==-1 ) {
        p1= query(x/2);
        v[x/2%modh].push_back(mp(x/2, p1));
    }

    if ( x%2==1 ) {
        return ((i64)p1*p1)%mod;
    } else {
        p2= check(x/2-1);
        if ( p2==-1 ) {
            p2= query(x/2-1);
            v[(x/2-1)%modh].push_back(mp(x/2-1, p2));
        }

        return ((i64)p1*p2*2%mod)%mod;
    }
}

int main(  ) {
    int m;
    fin>>m;
    for ( int cnt= 1; cnt<=m; ++cnt ) {
        i64 x;
        fin>>x;

        for ( int i= 0; i<modh; ++i ) v[i].clear();
        v[0].push_back(mp(0, 1));
        v[1].push_back(mp(1, 1));
        fout<<query(x)<<"\n";
    }

    return 0;
}