Cod sursa(job #626840)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 28 octombrie 2011 14:14:44
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 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(long int &suma,long int &nr, long int n){
 long int p;
 long int i=0,q=1;
 nr=1;
 suma=1; 
 while((((long int)prim[i])*prim[i])<=n){
    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 = (suma*(n+1) % modulo);
  }
 
}

int main(){
   int t;
   long int n;
   long 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,"%ld",&n);
      ssnd(suma,nr,n);
      fprintf(fout,"%ld %ld\n",nr,suma); 
   }
  fclose(fin);
  fclose(fout);
return 0;
}