Cod sursa(job #405500)

Utilizator alexandru92alexandru alexandru92 Data 28 februarie 2010 09:56:44
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <vector>
#include <fstream>
#include <cstdlib>
#define Modulo 9973
#define Nmax 100000

/*
 *
 */
using namespace std;
typedef long long int lld;
char is_prime[Nmax/16+1];
vector< unsigned int > PrimeNr;
void Sieve_of_Eratosthenes( void )
{
	unsigned int i, j;
	for( i=1; ((i*i)<<1)+(i<<1) <= Nmax; ++i )
		if( 0 == ( is_prime[i>>3]&(1<<(i&7)) ) )
			for( j=((i*i)<<1)+(i<<1); (j<<1)+1 <= Nmax; j+=(i<<1)+1 )
				is_prime[j>>3]|=(1<<(j&7));
	PrimeNr.push_back(2);
	for( i=3; (i<<1)+1 <= Nmax; ++i )
	{
		j=(i-1)/2;
		if( 0 == ( is_prime[j>>3]&(1<<(j&7)) ) )
			PrimeNr.push_back( i );
	}
}
inline lld pow( lld x, lld n ) //x^n 
{
	lld r=1;
	for( ; n; n>>=1 )
	{
		if( n&1 )
			r=(r*x)%Modulo;
		x=(x*x)%Modulo;
	}
	return r;
}
int main( void )
{
	lld t, n, i, j, s, nr;
	ifstream in( "ssnd.in" );
	ofstream out( "ssnd.out" );
	in>>t;
	Sieve_of_Eratosthenes();
	for( ; t; --t )
	{
		in>>n;
		if( n%2 ) //maybe it is prime
		{
			i=(n-1)/2;
			if( 0 == (is_prime[i>>3]&(1<<(i&7))) )
			{
				out<<"2 "<<( (1+n)%Modulo )<<'\n';
				continue;
			}
		}
		s=nr=1;
		for( i=0; 1LL*PrimeNr[i]*PrimeNr[i] <= n; ++i )
			if( 0 == n%PrimeNr[i] )
			{
				for( j=0; 0 == n%PrimeNr[i]; ++j, n/=PrimeNr[i] );
				nr=(nr*j+nr)%Modulo;
				s=( (s%Modulo)*( (pow( PrimeNr[i], j+1 )-1)/(PrimeNr[i]-1) )%Modulo )%Modulo;
			}
		if( n > 1 )
		{
			nr*=2;
			s=( s*( (n*n-1)/(n-1) ) )%Modulo;
		}
		out<<nr<<' '<<s<<'\n';
	}
	return 0;
}