Cod sursa(job #616010)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 11 octombrie 2011 15:45:50
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb

#include<vector>
#include<fstream>
#include<cstdlib>
#define Modulo 9973
#define Nmax 1000000

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