Cod sursa(job #509597)

Utilizator liviu12345Stoica Liviu liviu12345 Data 11 decembrie 2010 14:24:51
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <cstdlib>

using namespace std ;

const int MODULO = 9973 ;

bool ciur [ 1000000 ] ;

void generareCiur ( ) ;

inline int ridicarePutere ( int Baza , int Exponent )
{
  int bit = 1 , rezultat = 1 ;
  while ( Exponent )
  {
    if ( Exponent & bit )
    {
      rezultat *= Baza ;
      rezultat %= MODULO ;
    }
    Exponent >>= 1 ;
    Baza *= Baza ; 
    Baza %= MODULO ;
  }
  return rezultat ;
}

int main ( )
{
  freopen ( "ssnd.in" , "r" , stdin ) ;
  freopen ( "ssnd.out" , "w" , stdout ) ;
  int sumaCurenta , nrTermeni , nrDivizori , p ;
  long long termenCurent ;
  scanf ( "%d" , &nrTermeni ) ;
  generareCiur ( ) ;
  for ( int i = 0 ; i < nrTermeni ; ++i )
  {
    scanf ( "%lld" , &termenCurent ) ;
    sumaCurenta = 1 ;
    nrDivizori = 1 ;
    for ( int j = 2 ; j < 1000000 ; ++j )
    {
      if ( termenCurent == 1 )
	break ;
      if ( ciur [ j ] )
	continue ;
      p = 1 ;
      while ( termenCurent % j == 0 )
      {
	termenCurent /= j ;
	++p ;
      }
      nrDivizori *= p ;
      if ( p > 1 )
      {
	sumaCurenta *= ( ridicarePutere ( j , p ) - 1 ) / ( j - 1 ) ;
	sumaCurenta %= MODULO ;
      }
    }
    if ( termenCurent > 1 )
    {
      ++termenCurent ;
      termenCurent %= MODULO ;
      printf ( "2 %lld\n" , termenCurent ) ;
    }
    else
      printf ( "%d %d\n" , nrDivizori , sumaCurenta ) ;
  }
}

void generareCiur ( )
{
  for ( int i = 4 ; i <= 1000000 ; i += 2 )
    ciur [ i ] = true ;
  for ( int i = 3 ; i < 1000000 ; i+=2 )
  {
    if ( ciur [ i ] )
      continue ;
    for ( int j = 2 * i ; j < 1000000 ; j += i )
    {
      ciur [ j ] = true ;
    }
  }
}