Cod sursa(job #957357)

Utilizator radu33Nesiu Radu radu33 Data 4 iunie 2013 21:40:32
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<fstream>
#define NMAX 100007
#define MO 9973
#include<math.h>
#include<iostream>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
  
struct factori{int factor;
int p;};
factori divi[256];
long  prim[100000];
int t,N,l=1,k=1;
bool v[NMAX];
 
 
void ciur()
{int i,j;
  
    for(i=2;i<NMAX;i++)
       if(v[i]==0)
        {prim[k]=i;k++;
            for(j=i+i;j<NMAX;j=j+i)
             v[j]=1;
        }
  
  
}//ciuruim numerele pana la 10^6 si le tinem minte in prim
  
  
  
void curatare()
{int i;
for(i=1;i<=l;i++)
    {divi[i].factor=0;
        divi[i].p=0;}
l=1;
}
  

int suma()
{int i,s=1;
for(i=1;i<=l;i++)
    s=s*(divi[i].p+1);
return s;
}
  
  
int putere(long a,long b)
{int i,p=1;for(i=1;i<=b;i++)
    p=p*a;
return p;
}
  

int produs()
{int i,p=1;
for(i=1;i<=l;i++)
    p=1LL*(p*(putere(divi[i].factor,divi[i].p+1)-1)/(divi[i].factor-1))%MO;
  
  
  
  
return p%MO;
}
  
 
 
void incarcare()
{int i,ok=0;
  
for(i=1;i<k;i++)//daca e un factor prim
     {if(N%prim[i]==0)//daca e divizor
      {divi[l].factor=prim[i];//incarcam ca fiind factor
       while(N%prim[i]==0)//calculam puterea
          {N/=prim[i];divi[l].p++;}
      l++;}
      ok=1;
     }
if(ok==0){divi[1].factor=N;divi[1].p=1; }
  
  
}
  
   
 
 
int main()
{int i;f>>t;
ciur();
for(i=1;i<=t;i++)
{f>>N;
incarcare();
 
  
  
g<<suma()<<" ";
g<<produs()<<"\n";
curatare();
}
return 0;
}