Cod sursa(job #496285)

Utilizator pirvupirvu tudor pirvu Data 28 octombrie 2010 12:09:40
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<cstdio>

const long long N=1<<20;

bool ciur[N];

long long prim[N>>3];

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

long long n,nr,t;


void descompunere(long long x)
{
	p[0]=0;
	
	d[0]=0;
	
	
	
	for (long long 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;
	
	
}

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

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

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