Cod sursa(job #950092)

Utilizator robert_stefanRobert Stefan robert_stefan Data 15 mai 2013 20:40:37
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 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];
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 ndiv=1, sdiv=1;
	long long a1, b2;
	for(int i=1; i <= nrp && N>1; i++)
	{
		if(N%p[i]==0){
			int pp=0;
			while(N%p[i]==0)
				++pp,
				N/=p[i];
			ndiv*=(pp+1);
			a1 = ( putere( p[i], pp+1 ) - 1 );
			b2 = ( a1 / (p[i] - 1) );
			sdiv = sdiv * b2 % 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;
}