Cod sursa(job #700937)

Utilizator netedu_andreiFII Andrei Netedu netedu_andrei Data 1 martie 2012 12:38:55
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<stdio.h>
#include <math.h>

long nr,i,t,suma,nrdiv,a[1000001],b[1000001];
void ciur(long x)
{
	long nr=2,nrp,pr=0;
	while(nr<=x)
	{
		if(a[nr]==0)
		{
			nrp=nr+nr;
			while (nrp<x)
			{
				a[nrp]=1;
				nrp+=nr;
			}
			pr++;
			b[pr]=nr;
		}
		nr++;
	}
}
	
long put(long x,long y)
{
	long nrc=1,ic;
	for(ic=1;ic<=y;ic++)
		nrc=nrc*x%9973;
	return nrc;
}
void prob(long nr)
{
	nrdiv=1,suma=1;
	long max=int(sqrt(nr)),i;
	for(i=1;i<=max;i++)
	{
		if(nr%b[i]==0){
		long p=1;
		while (nr%b[i]==0)
		{
			p++;
			nr/=b[i];
		}
		nrdiv*=p;
		suma=(suma*((((put(b[i],p)-1)/(b[i]-1)))%9973))%9973;
		}
	}
}
int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	scanf("%ld",&t);
	ciur(1000000);
	for(i=1;i<=t;i++)
	{
		scanf("%ld",&nr);
		prob(nr);
		if(nrdiv==1 && suma==1) nrdiv=2,suma=(nr+1)%9973;
		printf("%ld %ld\n",nrdiv,suma);
	}
	return 0;
}