Cod sursa(job #494149)

Utilizator stinkyStinky si Grasa stinky Data 20 octombrie 2010 20:43:22
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1 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;
}

long long putere(long long a,int n)
{
	long long p = 1;
	while(n != 0)
	{
		if(n&1 != 0)
			p *= a;
		a *= a;
		n >>= 1;
	}
	return p;
}

void calcul(long long n)
{
	int i,pow,nr = 1;
	long long s = 1,p;
	for(i=1 ; (long long)pr[i]*pr[i] <= n ; ++i)
	{
		for(pow=0 ; n%pr[i]==0 ; n/=pr[i])
		{
			//p *= pr[i];
			++pow;
		}
		p = putere(pr[i],pow + 1);
		s *= (long long)(p - 1) / (pr[i] - 1);
		s %= r;
		nr *= (pow + 1);
	}
	if(n != 1)
	{
		s *= n + 1;
		nr <<= 1;
	}
	s %= r;
	printf("%d %d\n",nr,(int)s);
}

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);
		calcul(n);
	}
	return 0;
}