Cod sursa(job #496198)

Utilizator nightwish0031Vlad Radu Cristian nightwish0031 Data 28 octombrie 2010 09:11:43
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<cstdio>

int prim[500000];
const int N=1<<20;
const int MOD=9973;
bool c[N];

void ciur()
{
	int i,j;
	for (i=2;i*i<N;++i)
		if (c[i]==false)
			for (j=i*i;j<N;j+=i)
				c[j]=true;
			
	for (i=2;i<N;++i)
		if (c[i]==false)
			prim[++prim[0]]=i;
}

void fisiere()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
}

void prelucreaza(long long n)
{
	
	int e,nd=1,p;
	long long sd=1;
	int nn=1;
	while(prim[nn]*prim[nn]<=n&&nn<=prim[0])
	{
		if(n%prim[nn])
			{	
				++nn;
				continue;
			}
		e=0;
		p=1;
		while (n%prim[nn]==0)
		{
			++e;
			p=p*prim[nn];
			p=p%MOD;
			n=n/prim[nn];
		}
		if (e)
		{
			nd=nd*(e+1);
			p=p*prim[nn]%MOD;
			sd=sd*(p-1)/(prim[nn]-1)%MOD;
		}
		++nn;
	}
	
	if (n!=1)
	{
		nd=nd*2;
		p=n%MOD*n%MOD;
		sd=sd*(p-1)/(n-1)%MOD;
	}
	printf ("%d %d\n",nd,(int)sd);
}

void citeste()
{
	int i,t;
	long long n;
	
	fisiere();
	scanf("%d",&t);
	for (i=1;i<=t;++i)
	{
		scanf("%lld",&n);
		prelucreaza(n);
	}
}

int main()
{
	ciur();
	citeste();
	
	return 0;
}