Cod sursa(job #1059608)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 16 decembrie 2013 20:06:19
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <cstdio>
#include<iostream>

using namespace std;
#define REST 9973
#define MILION 1000001

bool ciur[MILION];
int nprime[500001], nr;

inline int invers_mod( int n, int r ) {
    if( r == 0 )
        return 1;
    if( n == 0 )
        return 0;
    if( r % 2 == 0 )
        return invers_mod( ( n * n ) % REST, r / 2 ) % REST;
    return ( n * invers_mod( n, r - 1 ) % REST ) % REST;
}

void ciur_vector( ) {
    int p = 1001;

    for( int i = 2 ; i <= p ; ++i )
        for( int j = i ; j * i <= MILION ; ++j )
            ciur[j*i] = 1;
    for( int i = 2 ; i <= MILION ; ++i )
        if( ciur[i] == 0 )
            nprime[nr++] = i;
}


int main () {


    freopen( "ssnd.in", "r", stdin );
    freopen( "ssnd.out", "w", stdout );

    int t, put, d;
    unsigned long long n, nrd, sd, numar;

    cin>>t;


    ciur_vector();

    for( int z = 0 ; z < t ; ++z ) {
        cin>>n;
        nrd = 1;
        sd = 1;
        d = 0;

        while( (long long) nprime[d] * nprime[d] <= n ) {

            numar = 1;
            put = 0;
            while( n % nprime[d] == 0 ) {
                ++put;
                numar *= nprime[d];
                //cout<<nprime[d]<<" "<<d<<" "<<n<<endl;
                n /= nprime[d];
            }

            if( put ) {
                nrd = ( nrd * ( put + 1 ) ) % REST;
                long long temp = ( ( ( numar * nprime[d] ) %REST ) + REST - 1 );
                sd = ( sd * temp ) % REST;
                sd = (sd *  invers_mod( (nprime[d] - 1) % REST, REST-2 )) % REST; //numar: nprime[d]^a ; put:a nprime[d] : p
            }

            ++d;

        }

        if( n > 1 ) {
            nrd *= 2;
            nrd %= REST;
            sd *= ( ( ( ( n * n) % REST ) - 1 ) * invers_mod( (n - 1) % REST, REST-2) );
            sd %= REST;
        }
        cout<<nrd<<" "<<sd<<endl;
    }


    return 0;

}