Cod sursa(job #496268)

Utilizator pirvupirvu tudor pirvu Data 28 octombrie 2010 11:46:23
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<cstdio>

const int N=1<<20;

bool ciur[N];

int prim[N>>3];

int p[1<<5],d[1<<5];

int n,nr,t;


void descompunere(int x)
{
	p[0]=0;
	
	d[0]=0;
	
	
	
	for (int i=1;prim[i]*prim[i]<=x;i++)
	{
		if (x%prim[i]==0) 
		{
			p[++p[0]]=prim[i];
			
			++d[0];
			d[d[0]]=0;
			while (x%prim[i]==0)
			{
				x/=prim[i];
				d[d[0]]++;
			}
		}
		
		
	}
	
	if (x>1) p[++p[0]]=x;
	if (x>1) d[++d[0]]=1;
	
	
}

int numar()
{
	int s=1;
	for (int i=1;i<=d[0];i++)
		s*=d[i]+1;
	return s;
}

int suma()
{
	int pr=1;
	for (int i=1;i<=p[0];i++)
	{
		int s=1;
		for ( int j=1;j<=d[i]+1;j++)
			s*=p[i];			
		
		if (s>1) s-=1;
		
		pr*=s;
		pr/=p[i]-1;
	}
	
	
	
	return pr;
}

int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	
	
	scanf("%d", &t);
		
	for (int i=2;i*i<N;i++)
	{
		if (ciur[i]==0)
		for (int j=i*i;j<N;j+=i)
			ciur[j]=1;
		
	}
	
	
	for (int i=2;i<N;i++)
		if ( ciur[i] == 0 ) prim[++nr]=i;
	
	for (int i=1;i<=t;i++)
	{
		scanf("%d", &n);
		
	    descompunere(n);
		
		printf("%d %d\n", numar() , suma() );
		
	}
	
	
	return 0;
}