Cod sursa(job #407845)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 2 martie 2010 17:57:57
Problema Suma si numarul divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#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;
}