Cod sursa(job #949083)

Utilizator matei_cChristescu Matei matei_c Data 12 mai 2013 14:06:11
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<fstream>
#include<bitset>
using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

#define maxn 1000001
#define mod 9973

int nrp, prim[maxn] ;
bitset<maxn> ok ;

long long N ;

int tst ;

void ciur()
{
    for(int i = 2; i < maxn; ++i )
    {
        if( ok[i] == 0 )
        {
            prim[ ++nrp ] = i ;

            for(int j = 2 * i; j < maxn; j += i )
                ok[j] = 1 ;
        }
    }
}

int putere(int x, int p)
{
    int rez = 1 ;

    x %= mod ;

    while( p )
    {
        if( p % 2 == 1 )
        {
            rez *= x ;
            rez %= mod ;
        }

        x *= x ;
        x %= mod ;

        p >>= 1 ;
    }

    return rez ;
}

void rezolvare()
{
    fin >> N ;

    int nd = 1, sd = 1 ;

    for(int i = 1; i <= nrp && ( long long )( prim[i] * prim[i] ) <= N; ++i )
    {
        if( N % prim[i] )
            continue ;

        int p = 0 ;

        while( N % prim[i] == 0 )
        {
            N /= prim[i] ;
            ++p ;
        }

        nd *= ( p + 1 ) ;

        int sus = ( putere( prim[i], p + 1 ) - 1 ) % mod ;
        int inv = putere( prim[i] - 1, mod - 2 ) % mod ;

        sd = ( ( ( sd * sus ) % mod ) * inv ) % mod ;
    }

    if( N > 1 )
    {
        nd *= 2;
        sd = ( ( long long )( sd * ( N + 1 ) ) % mod ) ;
    }

    fout << nd << " " << sd << "\n" ;
}

int main()
{
    ciur() ;

    fin >> tst ;

    for(int i = 1; i <= tst; ++i )
        rezolvare() ;

    return 0 ;
}