Cod sursa(job #531245)

Utilizator HoriaClementHoriaC HoriaClement Data 9 februarie 2011 11:45:33
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>

using namespace std;

const int M=1000000;
const int P=9973;

int v[M],m,t,pr=1,s=1;

long long x;

bool c[M]={false};

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

int pow(long long a,long long n)
{
	if(n==0)
		return 1;
	if(n%2)
		return a*pow(a*a,n/2);
	return pow(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(int x)
{
	s=1,pr=1;
	ciur();
	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*=(pow(v[i],p+1)-1)%P;
			s/=(v[i]-1);
			s%=P;
		}
	}
	if(x!=1)
	{
		pr*=2;
		s*=(pow(x,2)-1)/(x-1);
		s%=P;
	}
	out<<pr<<" "<<s<<"\n";
}

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