Cod sursa(job #1260019)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 10 noiembrie 2014 20:08:32
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<bitset>

using namespace std;

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

const int nmax = 1000000;
const int pmax = 80000;
const int mod = 9973;
int sum, nrd, nrp, prim[ pmax ];
bitset <nmax> ciur;

void make_ciur() {
    for( int i = 2; i * i < nmax; ++ i ) {
        if ( ciur[ i ] == 0 ) {
            for( int j = i * i; j < nmax; j += i ) {
                ciur[ j ] = 1;
            }
        }
    }
    nrp = 0;
    for( int i = 2; i < nmax; ++ i ) {
        if ( ciur[ i ] == 0 ) {
            prim[ nrp ++ ] = i;
        }
    }
}
void solve( long long n ) {
    long long p, e, k;
    sum = 1;
    nrd = 1;
    k = n;
    for( int i = 0; i < nrp && prim[ i ] * prim[ i ] <= n; ++ i ) {
        e = 0; p = 1;
        while ( k % prim[ i ] == 0 ) {
            ++ e;
            p *= prim[ i ];
            k /= prim[ i ];
        }
        if ( e > 0 ) {
            sum *= ( p * prim[ i ] - 1 ) / ( prim[ i ] - 1 );
            sum %= mod;
            nrd *= ( e + 1 );
        }
    }
    if ( k > 1 ) {
        sum *= ( 1 + k );
        sum %= mod;
        nrd *= 2;
    }
}
int main() {
    long long t, n;
    fin >> t;
    make_ciur();
    while( t -- ) {
        fin >> n;
        solve( n );
        fout << nrd << " " << sum << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}