Cod sursa(job #2134500)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 17 februarie 2018 23:56:11
Problema Ciuperci Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>
#define LIM 1000000
#define MAXN 100000

const long long MOD = 666013;
class Hash{
    public:
    int k = 0, next[MAXN + 1], lista[MOD];
    int val[MAXN + 1];
    long long d[1 + MAXN];
    inline void insert(int element, long long vl){
        k++;
        val[k] = element;
        d[k] = vl;
        next[k] = lista[element % MOD];
        lista[element % MOD] = k;
    }
    inline int find(int element){
        int p = lista[element % MOD];
        while(p != 0 && val[p] != element)
            p = next[p];
        return p;
    }
} H;

long long D(long long n){
    if(n <= 1) return 1;
    if(n > LIM){
        if(n % 2){long long x = D(n / 2); return (x * x) % MOD;}
        else return (2 * D(n / 2) * D(n / 2 - 1)) % MOD;
    }
    if(H.find(n)) return H.d[H.find(n)];
    long long ans;
    if(n % 2){long long x = D(n / 2); ans = (x * x) % MOD;}
    else ans = (2 * D(n / 2) * D(n / 2 - 1)) % MOD;
    H.insert(n, ans);
    return ans;
}

int main(){
    FILE*fi,*fo;
    fi = fopen("ciuperci.in","r");
    fo = fopen("ciuperci.out","w");

    int n;
    fscanf(fi,"%d", &n);
    for(int i = 1; i <= n; i++){
        long long x;
        fscanf(fi,"%lld", &x);
        fprintf(fo,"%lld\n", D(x));
    }

    return 0;
}