Cod sursa(job #531566)

Utilizator HoriaClementHoriaC HoriaClement Data 9 februarie 2011 21:23:10
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>

using namespace std;

const int M=1000005;
const int P=9973;

long long v[M],m,t;

long long x,pr=1,s=1;

bool c[M]={false};

ifstream in("ssnd.in");
ofstream out("ssnd.out");

long long fpow(long long a,long long n)
{
	if(n==0)
		return 1;
	if(n%2)
		return a*fpow(a*a,n/2);
	return fpow(a*a,n/2);
}

void ciur()
{
	for(int i=2;i*i<M;++i)
		if(!c[i])
			for(int j=i*i;j<M;j+=i)
				c[j]=true;
	m=0;
	for(int i=2;i<M;++i)
		if(!c[i])
			v[++m]=i;
}		


void desc(long long x)
{
	s=1,pr=1;
	for(int i=1;v[i]*v[i]<=x;++i)
		if(x%v[i]==0)
		{
			int p=0;
			while(x%v[i]==0)
			{
				x/=v[i];
				++p;
			}
			pr*=(p+1);
			s*=(fpow(v[i],p+1)-1)/(v[i]-1);
			s%=P;
		}
	if(x!=1)
	{
		pr*=2;
		s*=(fpow(x,2)-1)/(x-1);
		s%=P;
	}
	out<<pr<<" "<<s<<"\n";
}

void work()
{
	in>>t;
	ciur();
	for(int i=1;i<=t;++i)
	{
		in>>x;
		desc(x);
	}	
}
int main()
{
	work();
	return 0;
}