Cod sursa(job #558137)

Utilizator BitOneSAlexandru BitOne Data 17 martie 2011 09:17:49
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <vector>
#include <fstream>
#include <cstdlib>
#define N_MAX 62502
#define ValueMax 1000010
#define MODULO 9973

using namespace std;
char isPrime[N_MAX];
vector< int > PrimeNr;
inline bool isSet( int k ) { return 1 == ( isPrime[k>>3] & (1<<(k&7)) ); }
inline void Set( int k )   { isPrime[k>>3]|=1<<(k&7); }
inline void Sieve()
{
	int i, j, _count;
	for( i=1; ((i*i)<<1)+(i<<1) < ValueMax; ++i )
		if( 0 == ( isPrime[i>>3] & (1<<(i&7)) ) )
		{
			_count=(i<<1)+1;
			for( j=((i*i)<<1)+(i<<1); (j<<1) < ValueMax; j+=_count )
				isPrime[j>>3]|=(1<<(j&7));
		}
	PrimeNr.push_back(2);
	for( i=1, j=3; j < ValueMax; j+=2, ++i )
		if( 0 == ( isPrime[i>>3] & (1<<(i&7)) ) )
			PrimeNr.push_back(j);		
}
inline void gcd( int a, int b, int& X, int& Y )
{
	if( 0 == b )
	{
		X=1;
		Y=0;
		return;
	}
	int x0, y0;
	gcd( b, a%b, x0, y0 );
	X=y0;
	Y=x0-(a/b)*y0;
}
inline int pow( int x, int n )
{
	int r=1;
	for( ; n; n>>=1 )
	{
		if( n&1 )
		{
			r=(r*x)%MODULO;
			--n;
		}
		x=(x*x)%MODULO;
	}
	return r;
}
int main( void )
{
	int T;
	long long int N, i, j, number, s;
	ifstream in( "ssnd.in" );
	ofstream out( "ssnd.out" );
	Sieve();
	for( in>>T; T; --T )	
	{
		in>>N;
		number=s=1;
		for( i=0; 1LL*PrimeNr[i]*PrimeNr[i] <= N; ++i )
			if( 0 == N%PrimeNr[i] )
			{
				for( j=1; 0 == N%PrimeNr[i]; N/=PrimeNr[i], ++j );
				number=(number*j)%MODULO;
				s=( 1LL*s*( pow( PrimeNr[i], j )-1 )*pow( PrimeNr[i]-1, MODULO-2 ) )%MODULO;
			}
		if( N > 1 )
		{
			number=(number*2)%MODULO;
			s=( s*( N+1 ) )%MODULO;
		}
		out<<number<<' '<<s<<'\n';
	}
	return EXIT_SUCCESS;
}