Cod sursa(job #494156)

Utilizator stinkyStinky si Grasa stinky Data 20 octombrie 2010 20:49:10
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <cstdio>

const int r = 9973;
const int N = 1<<20;

bool c[N];
int pr[N],np;

void ciur()
{
	int i,j;
	for(i=2 ; i*i<N ; ++i)
		if(!c[i])
			for(j=i*i ; j<N ; j+=i)
				c[j] = true;
	for(i=2 ; i<N ; ++i)
		if(!c[i])
			pr[++np] = i;
}

int numar(long long n)
{
	int i,p,nr = 1;
	for(i=1 ; (long long)pr[i]*pr[i] <= n ; ++i)
	{
		if(n%pr[i] != 0)
			continue;
		for(p=0 ; n%pr[i] == 0 ; n/=pr[i])
			++p;
		nr *= (p + 1);
	}
	if(n != 1)
		nr <<= 1;
	return nr;
}

int suma(long long n)
{
	int i;
	long long s = 1,p;
	for(i=1 ; (long long)pr[i]*pr[i] <= n ; ++i)
	{
		if(n%pr[i] != 0)
			continue;
		for(p=1 ; n%pr[i]==0 ; n/=pr[i])
			p *= pr[i];
		s *= (long long)(p*pr[i] - 1) / (pr[i] - 1);
		s %= r;
	}
	if(n != 1)
		s *= n + 1;
	return s%r;
}

int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	int t;
	ciur();
	long long n;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lld",&n);
		printf("%d %d\n",numar(n),suma(n));
	}
	return 0;
}