Pagini recente » Cod sursa (job #11289) | Cod sursa (job #240138) | Diferente pentru preoni-2007/runda-3/solutii intre reviziile 18 si 53 | Rating Cont cu nume gresit sau fals (DarkHunterj) | Cod sursa (job #407845)
Cod sursa(job #407845)
#include <algorithm>
#include <bitset>
#include <cmath>
using namespace std;
#define MOD 9973
#define MAX_PRIM 80005
#define MAX_SQRT_N 1000005
typedef int int_32;
typedef long long int int_64;
int_32 T;
int_32 f_cnt, nr_div, sum_div, prim[ MAX_PRIM ], f_baz[ MAX_PRIM ], f_exp[ MAX_PRIM ];
int_64 N;
bitset <MAX_SQRT_N> f;
void ciur() {
int_32 i, j;
f.set();
f[ 0 ] = f[ 1 ] = false;
for( i = 2; i <= MAX_SQRT_N; ++i )
if( f[ i ] == true ) {
prim[ ++prim[ 0 ] ] = i;
for( j = 2*i; j <= MAX_SQRT_N; j += i )
f[ j ] = false;
}
}
int_32 get_pow( const int_32 &baz, const int_32 &exp ) {
int_32 i, aux, sol;
aux = baz;
sol = 1;
for( i = 1; i <= exp; i <<= 1 ) {
if( i & exp )
sol = (sol*aux) % MOD;
aux = (aux*aux) % MOD;
}
return sol;
}
void solve() {
int_32 i, aux_1, aux_2;
f_cnt = 0;
nr_div = sum_div = 1;
memset( f_baz, 0, sizeof( f_baz ) );
memset( f_exp, 0, sizeof( f_exp ) );
scanf( "%lld", &N );
for( i = 1; prim[ i ] <= N; ++i )
if( N % prim[ i ] == 0 ) {
++f_cnt;
f_baz[ f_cnt ] = prim[ i ];
while( N % prim[ i ] == 0 ) {
++f_exp[ f_cnt ];
N /= prim[ i ];
}
}
if( N > 1 ) {
f_cnt = 1;
f_baz[ 1 ] = N;
f_exp[ 1 ] = 1;
}
for( i = 1; i <= f_cnt; ++i ) {
aux_1 = ( f_exp[ i ] + 1 );
nr_div = ( nr_div * aux_1 ) % MOD;
aux_1 = get_pow( f_baz[ i ], f_exp[ i ] + 1 ) - 1;
aux_2 = get_pow( f_baz[ i ] - 1, MOD - 2 );
sum_div = ( sum_div * aux_1 ) % MOD;
sum_div = ( sum_div * aux_2 ) % MOD;
}
printf( "%d %d\n", nr_div, sum_div );
}
int main() {
freopen( "ssnd.in", "r", stdin );
freopen( "ssnd.out", "w", stdout );
ciur();
scanf( "%d", &T );
while( T-- )
solve();
return 0;
}