Pagini recente » Cod sursa (job #3146909) | Cod sursa (job #635390) | Cod sursa (job #1705704) | Cod sursa (job #2410451) | Cod sursa (job #635563)
Cod sursa(job #635563)
#include <stdio.h>
#include <vector>
using namespace std;
typedef long long ll;
const char IN[]="ciuperci.in",OUT[]="ciuperci.out";
const int mod=256 , mmod = mod -1,prime = 5077 , pmod=666013 ;
int Q;
ll N;
vector<pair<ll,int> > v[mod];
inline int sqrm(int x){
return 1LL*x*x%pmod;
}
inline int key(ll const &x){
return ( 1LL*x*prime )&mmod;
}
inline void add(ll const &x,int val){
int k=key(x);
v[k].push_back(make_pair(x,val));
}
inline int q(ll const &x){
int k=key(x);
for (int i=0;i<v[k].size();++i) if ( v[k][i].first == x )
return v[k][i].second;
return -1;
}
int query(ll const &x)
{
int r=q(x);
if (r!=-1) return r;
if (!(x&(x-1))) return x;
if (x<=1) return 1;
if ( x&1 ) r=sqrm(query(x/2));
else r= 1LL*2*query(x/2)*query(x/2-1)%pmod;
add(x,r);
return r;
}
int main()
{
int i,j;
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d",&Q);
for (j=0;Q--;++j)
{
if (j==1000) for (i=0,j=-1;i<mod;++i) v[i].clear();
scanf("%lld\n",&N);
printf("%d\n",query(N));
}
fclose(stdout);fclose(stdin);
return 0;
}