Cod sursa(job #494606)

Utilizator Adela_BaciuAdela Baciu Adela_Baciu Data 22 octombrie 2010 11:16:34
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda tema_1_10f Marime 0.89 kb
#include<cstdio>

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

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

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

inline 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 pow,nr=1;
	long long s=1,p;
	for(int i=1;(long long)pr[i]*pr[i]<=n;++i)
	{
		if (n%pr[i]!=0)
			continue;
		for (pow=0;n%pr[i]==0;n/=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;
	long long n;
	ciur();
	scanf("%d",&t);
	for (int i=1;i<=t;++i)
	{
		scanf("%lld",&n);
		calcul(n);
	}
	return 0;
}