Cod sursa(job #626962)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 28 octombrie 2011 18:05:58
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
//numarul divizorilor si suma lor
#include <stdio.h>

#define nmax 1000010
#define modulo 9973

bool v[nmax];
int prim[nmax/2],k=0;

void ssnd(int &suma,int &nr, long long n){
 int p,i=0;
 long long q=1;
 nr=1;
 suma=1; 
 while(((long long)prim[i])*prim[i]<=n){
    if(n%prim[i]){ i++;continue;}
    p=1;
    q=prim[i];
    while (n%prim[i]==0){
          n/=prim[i];
          p++;
          q*=prim[i];
    }
   nr*=p;
   suma=(suma*(q-1)/(prim[i]-1))%modulo;
   i++;
 }
 if (n>1){
    nr*=2;
    suma = (((/*(long long)*/suma)*(n+1)) % modulo);
  }
 
}

int main(){
   int t;
   long long n;
   int suma,nr;
   //generez, cu ciurul lui eratostene, toate nr prime <=10^6
   int i=2,j;
   while(i<nmax){
      if(v[i]==0){
        //deci i e numar prim
        prim[k++]=i;
        //notez in tot vectorul
         for(j=i;j<nmax;j+=i)
             v[j]=1;
      }
   i++;
   }

   FILE *fin=fopen("ssnd.in","r");
   FILE *fout=fopen("ssnd.out","w");
   fscanf(fin,"%d",&t);

   for(i=0;i<t;i++){
      fscanf(fin,"%lld",&n);
      ssnd(suma,nr,n);
      fprintf(fout,"%d %d\n",nr,suma); 
   }
  fclose(fin);
  fclose(fout);
return 0;
}