Cod sursa(job #990599)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 28 august 2013 18:21:31
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>

using namespace std;

int fact[10000],exp[10000],ciur[1000010],prim[100000],nr;

inline long long LgPut(int n, int p)
{
	long long put=1,m;
	m=1LL*n;
	while(p>0)
	{
		if(p&1)
		{
			put=(put*m);
			p--;
		}
		m=(m*m);
		p=p>>1;
	}
	return put;
}

inline void Ciur()
{
	int i,j;
	for(i=3;i<=1000;i+=2)
		if(ciur[i]==0)
			for(j=i*i;j<=1000000;j+=2*i)
				ciur[j]=1;
	nr=1;prim[1]=2;
	for(i=3;i<=1000000;i+=2)
		if(ciur[i]==0)
			prim[++nr]=i;
}

int main()
{
	int i,len,t,k,d,sol1,poz,q,sol2;
	long long n,a;
	freopen ("ssnd.in","r",stdin);
	freopen ("ssnd.out","w",stdout);
	scanf("%d", &t);
	Ciur();
	for(q=1;q<=t;q++)
	{
		scanf("%lld", &n);len=0;
		for(poz=1;poz<=nr;poz++)
		{
			if(1LL*prim[poz]*prim[poz]>n)
				poz=nr+1;
			else
			{
				k=0;d=prim[poz];
				while(n%d==0)
				{
					k++;
					n/=d;
				}
				if(k)
				{
					len++;
					fact[len]=d;
					exp[len]=k;
				}
			}
		}
		sol1=1;sol2=1;
		for(i=1;i<=len;i++)
		{
			sol1=sol1*(exp[i]+1);
			a=LgPut(fact[i],exp[i]+1);
			a--;
			a=a/(fact[i]-1);
			sol2=(sol2*a)%9973;
		}
		if(n>1)
		{
			sol1*=2;
			sol2=(1LL*sol2*(n+1))%9973;
		}
		printf("%d %d\n", sol1,sol2);
	}
	return 0;
}