Pagini recente » Cod sursa (job #1608206) | Cod sursa (job #1090037) | Cod sursa (job #1098274) | Cod sursa (job #1040653) | Cod sursa (job #509708)
Cod sursa(job #509708)
#include <cstdio>
#include <cstdlib>
using namespace std ;
const int MODULO = 9973 ;
const int PINV = 9971 ;
bool ciur [ 1000000 ] ;
void generareCiur ( ) ;
inline int sqrt ( long long X )
{
long long St = 1 , Dr = X , mid ;
while ( Dr - St > 1 )
{
mid = ( St + Dr ) >> 1 ;
if ( mid * mid > X )
Dr = mid ;
else
St = mid ;
}
return ( int ) Dr ;
}
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 ,Stop ;
long long termenCurent ;
scanf ( "%d" , &nrTermeni ) ;
generareCiur ( ) ;
for ( int i = 0 ; i < nrTermeni ; ++i )
{
scanf ( "%lld" , &termenCurent ) ;
sumaCurenta = 1 ;
nrDivizori = 1 ;
Stop = sqrt ( termenCurent ) ;
p = 1 ;
while ( termenCurent % 2 == 0 )
{
termenCurent >>= 1 ;
++p ;
}
if ( p > 1 )
{
sumaCurenta *= ( ridicarePutere ( 2 , p ) - 1 ) ;
sumaCurenta %= MODULO ;
nrDivizori *= p ;
}
for ( int j = 3 ; j <= Stop ; j+=2 )
{
if ( termenCurent == 1 )
break ;
if ( ciur [ j ] )
continue ;
p = 1 ;
while ( termenCurent % j == 0 )
{
termenCurent /= j ;
++p ;
}
if ( p > 1 )
{
sumaCurenta *= ( ridicarePutere ( j , p ) - 1 ) ;
sumaCurenta %= MODULO ;
sumaCurenta *= ridicarePutere ( j - 1 , PINV ) ;
sumaCurenta %= MODULO ;
nrDivizori *= p ;
}
}
if ( termenCurent > 1 )
{
sumaCurenta *= ridicarePutere ( termenCurent , 2 ) - 1 ;
sumaCurenta %= MODULO ;
sumaCurenta *= ridicarePutere ( termenCurent , PINV ) - 1 ;
sumaCurenta %= MODULO ;
nrDivizori <<= 1 ;
printf ( "%d %d\n" , nrDivizori , sumaCurenta ) ;
}
else
printf ( "%d %d\n" , nrDivizori , sumaCurenta ) ;
}
}
void generareCiur ( )
{
int k ;
for ( int i = 4 ; i <= 1000000 ; i += 2 )
ciur [ i ] = true ;
for ( int i = 3 ; i < 1000 ; i+=2 )
{
if ( ciur [ i ] )
continue ;
k = 2 * i ;
for ( int j = i * i ; j < 1000000 ; j += k )
{
ciur [ j ] = true ;
}
}
}