Cod sursa(job #496209)

Utilizator nightwish0031Vlad Radu Cristian nightwish0031 Data 28 octombrie 2010 09:35:19
Problema Suma si numarul divizorilor Scor 100
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;
	long long 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;
			n=n/prim[nn];
		}
		nd=nd*(e+1);
		p=p*prim[nn];
		sd=sd*((p-1)/(prim[nn]-1))%MOD;
		//printf("%d^%d p=%d\n",prim[nn],e,p);
		++nn;
	}
	
	if (n!=1)
	{
		nd=nd*2;
		sd=sd*(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;
}