Cod sursa(job #956131)

Utilizator radu33Nesiu Radu radu33 Data 2 iunie 2013 12:21:09
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
#define NMAX 1000007

#include<math.h>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");

struct factori{int factor;
int p;};
factori div[100];

int t,N,l=1;

bool v[NMAX];
void ciur()
{int i,j;

	for(i=2;i<=NMAX;i++)
		v[i]=1;

	for(i=2;i<=NMAX;i++)
       if(v[i])
        for(j=i+i;j<=NMAX;j=j+i)
             v[j]=0; 
	   
               
	   


}//ciuruim numerele pana la 10^6



void curatare()
{int i;
for(i=1;i<=l;i++)
	{div[i].factor=0;
		div[i].p=0;}
l=1;
}






int suma()
{int i,s=1;
for(i=1;i<=l;i++)
	s=s*(div[i].p+1);
return s;
}


int putere(int a,int 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=p*(putere(div[i].factor,div[i].p+1)-1)/(div[i].factor-1);




return p;
}

void incarcare()
{int i,ok=0,m;

for(i=2;i<=NMAX;i++)
   if(v[i]==1)//daca e un factor prim
	 {if(N%i==0)//daca e divizor
	  {div[l].factor=i;//incarcam ca fiind factor
	   m=N;
	   while(m%i==0)//calculam puterea
	      {m=m/i;div[l].p++;}
	  l++;}
	  ok=1;
	 }
if(ok==0){div[1].factor=N;div[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;
}