Cod sursa(job #1220576)

Utilizator ArmandNMArmand Nicolicioiu ArmandNM Data 17 august 2014 18:36:04
Problema Ciuperci Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <vector>

const int MOD = 666013;

using namespace std;
ifstream f("ciuperci.in");
ofstream g("ciuperci.out");

long N,Q;
vector <int> H[305],HH[305];

int HASH(long long X)
{
    long long aux;
    aux = (X*3+123)%300;
    return aux;
}

long long SOL(int X)
{
    long long A,B;
    int aux;
    bool ok = false;
    aux = HASH(X);
    if (X == 2)
        return 2;
    if (X == 1)
        return 1;
    for (int i = 0; i < H[aux].size(); ++i)
    {
        if (H[aux][i] == X)
        {
            A = HH[aux][i];
            ok = true;
            return HH[aux][i];
        }
    }
    if (!ok)
    {
        if (X % 2 == 1)
        {
            A = SOL(X/2);
            H[aux].push_back(X);
            HH[aux].push_back(A*A%MOD);
            return A*A % MOD;
        }
        else
        {
            A = SOL(X/2);
            B = SOL(X/2-1);
            H[aux].push_back(X);
            HH[aux].push_back(2*A*B%MOD);
            return 2*A*B % MOD;
        }
    }
}

int main()
{
    f >> Q;
    while (Q--)
    {
        f >> N;
        g << SOL(N) << '\n';
    }
    f.close();
    g.close();
    return 0;
}