Pagini recente » Istoria paginii runda/dornescu2 | Cod sursa (job #2889417) | Cod sursa (job #471224) | Istoria paginii runda/boji_round2/clasament | Cod sursa (job #1463642)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin ("ssnd.in") ;
ofstream fout ("ssnd.out") ;
bool ciur [1000001] ;
int t , n ;
int primes [100000] , nr ;
void Eratostene ()
{
for ( int i = 4 ; i < 1000000 ; i += 2 )
ciur [i] = true ;
ciur [0] = true , ciur [1] = true ;
for ( int i = 3 ; i < 1000000 ; i += 2 )
if ( ciur [i] == false )
for ( int j = i << 1 ; j < 1000000 ; j += i )
ciur [j] = true ;
primes [ ++ nr ] = 2 ;
for ( int i = 3 ; i < 1000000 ; i += 2 )
if ( ciur [i] == false )
primes [ ++ nr ] = i ;
}
int pow ( int x , int p ) // fast expo
{
int rez = 1 ;
x %= 9973 ;
for(; p; p >>= 1)
{
if ( p & 1 )
{
rez *= x;
rez %= 9973 ;
}
x *= x ;
x %= 9973 ;
}
return rez;
}
void CalculSumaSiDivizori ( int n )
{
int sum_diviz = 1 , nr_diviz = 1 , nr_aux , copie = n ;
for ( int i = 1 ; primes [i] <= sqrt ( copie ) ; ++ i )
{
if ( copie % primes [i] ) continue ;
nr_aux = 0 ;
while ( copie % primes [i] == 0 )
{
++ nr_aux ;
copie /= primes [i] ;
}
nr_diviz *= ( nr_aux + 1 ) ;
int p1 = ( pow ( primes [i] , nr_aux + 1 ) - 1 ) % 9973 ;
int p2 = pow ( primes [i] - 1, 9973 - 2 ) % 9973 ;
sum_diviz = ((( sum_diviz * p1 ) % 9973 ) * p2 ) % 9973 ;
}
if ( copie > 1 )
{
nr_diviz *= ( 1 + 1 ) ;
sum_diviz = ( 1LL * sum_diviz * ( copie + 1 ) % 9973 ) ;
}
fout << nr_diviz << " " << sum_diviz << "\n" ;
}
int main()
{
Eratostene () ;
for ( fin >> t ; t ; -- t )
fin >> n , CalculSumaSiDivizori ( n ) ;
return 0;
}