Cod sursa(job #408851)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 3 martie 2010 11:51:14
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#define ll long long
#define NMAX 17
#define MOD 9973
int t,r,sum;
struct div
{
	ll a,b;
};
div A[NMAX];
ll n,rez;
void get_divs()
{
	ll i;
	for (i=2; i*i<=n; i++)
		if (n%i==0)
		{
			A[++r].a=i;
			while (n%i==0)
			{
				n/=i;
				A[r].b++;
			}
			rez*=A[r].b+1;
		}
	if (n!=1)
	{
		A[++r].a=n;
		A[r].b=1;
		rez*=2;
	}
}
ll lgput(ll baza,ll exp)
{
	ll part=1,part2=baza;
	while (exp)
	{
		if (exp & 1)
			part*=part2,part%=MOD;
		part2*=part2;
		part2%=MOD;
		exp>>=1;
	}
	return part;
}
ll factor(ll baza,ll exp)
{
	if (baza%MOD==0)
		return 1;
	if (baza%MOD==1)
		return exp+1;
	baza%=MOD;
	ll act=lgput(baza,exp+1),act2=lgput(baza-1,MOD-2);
	act--; 
	if (act<0)
		act+=MOD;
	return (act*act2)%MOD;
}
void get_sum()
{
	int i;
	for (i=1; i<=r; i++)
		sum*=factor(A[i].a,A[i].b),sum%=MOD;
}
void erase()
{
	int i;
	for (i=1; i<=r; i++)
		A[i].b=0;
}
int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	scanf("%d",&t);
	while (t)
	{
		scanf("%lld",&n);
		r=0; rez=1; sum=1;
		get_divs();
		get_sum();
		erase();
		printf("%lld ",rez);
		printf("%lld\n",sum);
		t--;
	}
	return 0;
}