Cod sursa(job #489874)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 3 octombrie 2010 21:52:55
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>

#include <math.h>

#define NMAX 1000005
#define rest 9973

using namespace std;




bool C[NMAX+30];
int Prim[NMAX+30];



inline void ciur()
{
	int k=1;
	Prim[1]=2;
	for(int i=3;i<=NMAX;i+=2)
	{
		if(!C[i])
		{
			Prim[++k]=i;
			if(i<=1000)
			for(int j=i*i;j<=NMAX;j=j+2*i)
				C[j]=true;
		}
	}
	
	
}

long long pow(int x,int y)
{
	
	
	long long ret=1;
	if(y==0) return 1;
	if(y==1) return x;
	else if(y%2==0)
	{
		ret=pow(x,y/2);
		return (ret*ret);
	}
	else
	{
		ret=(pow(x,(y-1)/2));
		return (x*ret*ret);
	}
}


void citire()
{
	fstream fin("ssnd.in",ios::in);
	fstream fout("ssnd.out",ios::out);

	int T;
	long long x;
	
	int nr;
	long long s;
	int p=0;
	fin>>T;
	for(int j=1;j<=T;j++)
	{
		nr=1;s=1;
		fin>>x;
		for(int i=1;1LL*Prim[i]*Prim[i]<=x;i++)
		{
			p=0;
			while(x%Prim[i]==0)
			{
				p++;
				x/=Prim[i];
			}
			if(p)
			{
				nr=nr*(p+1);
				s= (s*( ( ( pow(Prim[i],p+1) -1)/ (Prim[i]-1) ) %rest) )%rest;
			}
			
			
		}
		
		if(x>1)
		{
			nr=nr*2;
			s=(s*((x+1)%rest))%rest;
		}
		fout<<nr<<" "<<s<<"\n";
	}
	
	fin.close();
	fout.close();
}



int main(int argc, char* argv[])
{
	ciur();

	citire();
	
}