Cod sursa(job #637616)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 20 noiembrie 2011 15:36:17
Problema Ciuperci Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.79 kb
#include <stdio.h>
#include <stdlib.h>
#define modulo 666013
#define MAXIM 10005

int pozitie=MAXIM-1;
char buff[MAXIM];//citesc bucati de cate maxim 10005 caractere

void cit(long long &nr){
    nr=0;
    while(buff[pozitie]<'0' || buff[pozitie]>'9')//cat timp nu e cifra, treci mai departe
        if (++pozitie==MAXIM){
            fread (buff,1,MAXIM,stdin);
            pozitie=0;
        }
    while('0'<=buff[pozitie] && buff[pozitie]<='9'){//cat timp e cifra
        nr=nr*10+buff[pozitie]-'0';
        if (++pozitie==MAXIM){
            fread (buff,1,MAXIM,stdin);
            pozitie=0;
        }
     }
}



void pInvers(long long a, long long b, long long &u, long long &v) {
 if(b==0) {
  u=1; v=0;
 } else {
  long long p, q;
  pInvers(b, a%b, p, q); 
  u=q; v=p-(a/b)*q;
 }
}

long long Comb(long long n, long long k) {
 long long u, v;
 if(k==0 || k==n) return 1;
 pInvers(modulo, k, u, v);
 if(v<0)v+=modulo;
 return (((n*Comb(n-1, k-1))%modulo)*v)%modulo;
}

int ase(long long n) {
 long long m, k=-1, w=n;
 if(n==1)return 1;
 while(w) {w>>=1; k++;} m=(1<<(k-1)); k=(n>>1)-m;
 //printf("n=%d, m=%d, k=%d\n", n, m, k);
 w=Comb(m, k+1);
 if(n%2) 
  return((w*w)%modulo);
 else {
  return(2*w*Comb(m, k))%modulo;
 } 
}

int main() {
/*
 long k=atoi(argv[1]), x0, y0;
 pInvers(modulo, k, x0, y0);
 printf("Inversul lui k=%d este x0=%d\n", k, y0>0?y0:y0+modulo);
*/
// printf("Comb(%d,%d)=%d\n", atoi(argv[1]), atoi(argv[2]), Comb(atoi(argv[1]), atoi(argv[2])));
  freopen("ciuperci.in","r",stdin);
  freopen("ciuperci.out","w",stdout);
  long long q;
  long long i,n;  
  cit(q);
  for(i=0;i<q;i++){
    cit(n);//printf("%lld",n);
    printf("%d\n",ase(n));
  }
  

// printf("ase(%d)=%d\n", atoi(argv[1]), ase(atoi(argv[1])));
 return 0;
}