Cod sursa(job #950451)

Utilizator robert_stefanRobert Stefan robert_stefan Data 16 mai 2013 21:11:57
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<fstream>
#define MAX 1000001
#define IN "ssnd.in"
#define OUT "ssnd.out"
#define MODULO 9973
#include<bitset>

using namespace std;

ifstream in(IN);
ofstream out(OUT);

int T,nrp;
bitset <MAX> prim ;
int p[MAX/2];
long long N;

void ciur();
void rezolva();
inline long long putere(long long x, long long p);

int main()
{
	ciur();
	in>>T;
	for(int i=0; i<T; i++)
		rezolva();
	in.close();
	out.close();
	return 0;
}

void ciur()
{
	for(int i=2; i <= MAX; i++)
		if(prim[i]==0)
		{
			for(int j=i+i; j <= MAX; j+=i)
				prim[j]=1;
			p[++nrp]=i;
		}
}

void rezolva()
{
	in>>N;
	long long q=1, sdiv=1, ndiv=1;
	int pp;
	for(int i=1; i <= nrp && 1LL * p[i] * p[i] <= N ; ++i)
	{
		if(N%p[i])
			continue;
		pp=1;
		q=p[i];
		while(N%p[i]==0)
			pp++,
			N/=p[i],
			q*=p[i];
		ndiv*=pp;
		sdiv = ( sdiv * (q-1) / p[i]-1 ) % MODULO;
	}
	if(N>1)
		ndiv*=2,
		sdiv = ( 1LL * sdiv * (N+1) ) % MODULO;
		
	out<<ndiv<<' '<<sdiv<<'\n';
}

inline long long putere(long long x, long long p)
{
	long long sol=1;
	while(p)
	{
		if(p%2==1)
			sol=x*sol;
		x*=x;
		p/=2;
	}
	return sol;
}