Cod sursa(job #496507)

Utilizator joli94Apostol Adrian Alexandru joli94 Data 29 octombrie 2010 13:36:10
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<cstdio>
const int N = 1<<20;
int p[N] ;
bool a[N] ; 


void init()
{
	for (int i=2 ; i*i<N ; ++i )
	{
		if (!a[i])
		{
			for (int j=i*i ; j<N ; j+=i )
				a[j] = true;
		}
	}
	for(int i=2 ; i<N ; ++i)
		if(!a[i])
			p[++p[0]] = i;
}

void calcul(long long int n)
{
	long long int nr = 1, pow;
	int s=1 , exp;
	for(int i=1 ; (long long)p[i]*p[i]<=n ; ++i)
	{
		if ( n%p[i]==0 )
		{
			pow = p[i] ;
			exp = 1;
			while ( n%p[i]==0 )
			{
				n/=p[i];
				pow*=p[i];
				++exp;
			}
			nr *= exp;
			s *= (pow-1)/(p[i]-1);
			s%=9973;
		}
	}
	if (n!=1)
	{
		nr *=2;
		s *= n+1; 
		s%=9973;
	}
	printf("%lld %d\n" , nr , s );
}

int main()
{
	freopen ( "ssnd.in" , "r" , stdin ) ;
	freopen ( "ssnd.out" , "w"  , stdout ) ;
	
	int t;
	long long int n;
	
	scanf( "%d" , &t ) ;
	init();
	
	for (int i=1 ; i<=t ; ++i )
	{
		scanf ( "%lld" , &n ) ;
		calcul(n);
	}
	
	return 0;
}