Cod sursa(job #1813975)

Utilizator Tiberiu02Tiberiu Musat Tiberiu02 Data 23 noiembrie 2016 15:56:54
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
# include <iostream>
# include <fstream>

# include <vector>

using namespace std;

# define MAX_PRIME 1000000
vector<int> primes;
bool ciur[1 + MAX_PRIME];

void calc_primes( int lim )
{
    ciur[0] = ciur[1] = 1;
    for ( int i = 1; i * i <= lim; i ++ )
        if ( !ciur[i] )
            for ( int j = i * i; j <= lim; j += i )
                ciur[j] = 1;

    for ( int i = 1; i <= lim; i ++ )
        if ( !ciur[i] )
            primes.push_back( i );
}

vector<pair<long long, int> > decompose( long long n )
{
    vector<pair<long long, int> > divs;

    int p, i = 0;
    while ( i < primes.size()
    && primes[i] * primes[i] <= n ) {
        p = 0;
        while ( n % primes[i] == 0 ) {
            n /= primes[i];
            p ++;
        }

        if ( p != 0 )
            divs.push_back( make_pair( primes[i], p ) );

        i ++;
    }

    if ( n != 1 )
        divs.push_back( make_pair( n, 1 ) );

    return divs;
}

# define MOD 9973

void ssnd( int p, int d, const vector<pair<long long, int> > &divs, pair<int, int> &s )
{
    if ( p == divs.size() ) {
        s.first ++;
        s.second = ( s.second + d ) % MOD;
    } else {
        for ( int i = 0; i <= divs[p].second; i ++ ) {
            ssnd( p + 1, d, divs, s );
            d = ( d * divs[p].first ) % MOD;
        }
    }
}

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

    calc_primes( MAX_PRIME );

    int t;
    long long n;

    fin >> t;

    for ( int i = 0; i < t; i ++ ) {
        fin >> n;

        pair<int, int> s;
        s.first = s.second = 0;
        vector<pair<long long, int> > divs = decompose( n );

        ssnd( 0, 1, divs, s );

        fout << s.first << ' ' << s.second << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}