Pagini recente » Cod sursa (job #836343) | Cod sursa (job #1440332) | Cod sursa (job #2868305) | Cod sursa (job #2757136) | Cod sursa (job #637783)
Cod sursa(job #637783)
#include<cstdio>
#include<vector>
#define ll long long
#define pb push_back
#define mp make_pair
const int mod = 666013;
const int h = 23;
using namespace std;
vector < pair<ll , int> > H[h];
int i , j , t , cnt , mem[150005];
ll a;
int hash_look ( ll a ) {
int i;
int p = a % h;
for ( i = 0 ; i < H[p].size() ; ++i )
if ( H[p][i].first == a )
return H[p][i].second;
return -1;
}
int ret ( ll a ) {
if (a <= 150000) return mem[a];
int p = hash_look(a);
if ( p != -1 ) return p;
if ( a & 1 ) {
int ans = ret ( a >> 1 );
ans = (1LL * ans * ans) % mod;
H[a % h].pb( mp(a , ans));
return ans;
}
int ans1 = ret ( a >> 1 ) , ans2 = ret((a >> 1) - 1);
ans1 = (2LL * ans1 * ans2) % mod;
H[a % h].pb( mp (a , ans1));
return ans1;
}
int main()
{
freopen("ciuperci.in","r",stdin);
freopen("ciuperci.out","w",stdout);
scanf("%d",&t);
mem[1] = 1 , mem[2] = 2;
for ( i = 3 ; i <= 150000; ++i )
if ( i & 1 )
mem[i] = 1LL * mem[i >> 1] * mem[i >> 1] % mod;
else
mem[i] = 2LL * mem[i >> 1] * mem[(i >> 1) - 1] % mod;
for ( i = 1 ; i <= t ; ++i ) {
scanf("%lld",&a);
printf("%d\n",ret(a));
if ( i & 1 ) {
for ( j = 0 ; j < h ; ++j )
H[j].clear();
}
}
return 0;
}