Cod sursa(job #981558)

Utilizator superman_01Avramescu Cristian superman_01 Data 7 august 2013 15:33:11
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
#include<algorithm>
#include<utility>
#include<bitset>

#define MAX_N 1000005
#define MOD 9973

using namespace std;

ifstream in("ssnd.in");
ofstream out("ssnd.out");

int T, N;
bitset < MAX_N > ciur;
int divi[MAX_N],nr;

void MakeEratosthene ( void )
{
	int i , ii  ;
	for( i = 2 ; i <= MAX_N ; ++i )
		if( ciur[i] == false )
	{
	   divi[++nr] = i ;	
	 for( ii = i + i ; ii <= MAX_N ; ii+=i )
		 ciur[ii] = true ;
	}
}
int lgput ( int a , int b )
{
	int rez =1 ;
	while ( b )
	{
		if( b % 2 == 1 )
			rez = ( rez *a ) % MOD;
	a =  ( a*a) % MOD;
	b = b /2;
	}
	return rez;
}


int main ( void )
{
	int i , j;
	MakeEratosthene();
	in>>T;
	for( ; T > 0 ; --T )
	{
		in>>N;
		unsigned long long nd = 1 , sd = 1  , p1 , p2 ;
		for( i = 1 ; i <= nr && (long long) divi[i]*divi[i] <= N; ++i )
		{
			if( N % divi[i] )
				continue ;
			int p = 0 ;
			while(  N % divi[i] == 0 )
			{
				N /= divi[i];
				++p;
			}
			nd *= ( p+1) ;
			p1 = ( lgput( divi[i], p+1) -1 ) % MOD;
			//inversul modular , MOD -nr prim => Fermat
			p2 = ( lgput( divi[i] -1 , MOD-2) )  % MOD;
			sd = ( ( sd * p1 ) % MOD *p2) % MOD ;
		}
		if( N > 1 )
		{
			nd *= 2;
			sd = ( 1LL*sd*(N+1)%MOD);
		}
		out << nd <<" " << sd <<"\n";
	}
	in.close();
	out.close();
	return 0 ;	
}