Cod sursa(job #1059381)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 16 decembrie 2013 17:00:10
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#define REST 9973
#define MILION 1000001

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

void ciur_vector( ) {
    int p = 1001;

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


int main () {

    FILE *f, *g;
    f = fopen( "ssnd.in", "r" );
    g = fopen( "ssnd.out", "w" );

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

    fscanf( f, "%d" , &t );

    ciur_vector();

    for( int z = 0 ; z < t ; ++z ) {
        fscanf( f, "%lld", &n );
        nrd = 1;
        sd = 1;
        d = 0;
        numar = 1;
        while( nprime[d] * nprime[d] <= n ) {
            put = 0;
            while( n % nprime[d] == 0 ) {
                ++put;
                numar *= nprime[d];
                n /= nprime[d];
            }
            if( put ) {
                nrd = ( nrd * ( put + 1 ) ) % REST;
                sd = ( sd *( ( numar * nprime[d] - 1 ) / ( nprime[d] - 1 ) ) ) % REST; //numar: nprime[d]^a ; put:a nprime[d] : p
            }
            ++d;
        }
        if( n > 1 ) {
            nrd *= 2;
            nrd %= REST;
            sd *= ( ( n * n - 1 ) / ( n - 1 ) );
            sd %= REST;
        }
        fprintf( g, "%lld %lld\n", nrd, sd );
    }

    fclose( f );
    fclose( g );

    return 0;

}