Cod sursa(job #956146)

Utilizator radu33Nesiu Radu radu33 Data 2 iunie 2013 12:57:14
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<fstream>
#define NMAX 1000007
#define MO 9973
#include<math.h>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");

struct factori{int factor;
int p;};
factori divi[256];

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++)
	{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=(p*(putere(divi[i].factor,divi[i].p+1)-1)/(divi[i].factor-1))%MO;




return p%MO;
}

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
	  {divi[l].factor=i;//incarcam ca fiind factor
	   m=N;
	   while(m%i==0)//calculam puterea
	      {m=m/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;
}