Cod sursa(job #1926077)

Utilizator felipeGFilipGherman felipeG Data 13 martie 2017 22:41:05
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <iostream>
#define mod 9973
#define Nmax 1000005
using namespace std;

ifstream f ("ssnd.in");
ofstream g ("ssnd.out");

int t, prime[ Nmax ], nr_prime;
long long n;
bool viz[ Nmax ];

void ciur()
{
    int i, j;

    for ( i = 2; i < Nmax; ++ i )
    {
        if ( !viz[ i ] )
        {
            prime[ ++ nr_prime ] = i;

            for ( j = i + i; j < Nmax; j += i )
                viz[ j ] = true;
        }
    }
}

int rid_la_putere( int nr, int p )
{
    int i;
    int sol = 1;

    for ( i = 0; (1 << i) <= p; ++ i )
    {
        if ( ((1 << i) & p) > 0 )
            sol = (sol * nr) % mod;
        nr = (nr * nr) % mod;
    }

    return sol;
}

void solve()
{
    int i, p = 0, nr_divi = 1, suma_divi = 1;

    f >> n;

    for ( i = 1; i <= nr_prime && 1LL * prime[ i ] * prime[ i ] <= n; ++ i )
    {
        if ( n % prime[i] )
            continue;

        while ( n % prime[ i ] == 0 )
        {
            n /= prime[ i ];
            p ++;
        }

        nr_divi *= (p + 1);

        int numarator = (rid_la_putere( prime[ i ], p + 1 ) - 1) % mod;
        int numitor = rid_la_putere( prime[ i ] - 1, mod - 2 ) % mod;

        suma_divi = (((suma_divi * numarator) % mod) * numitor) % mod;
    }

    if ( n > 1 )
    {
        nr_divi *= 2;
        suma_divi = (1LL * suma_divi * (n + 1) % mod);
    }

    g << nr_divi << " " << suma_divi << '\n';
}

int main()
{
    int i = 0;

    ciur();

    f >> t;

    for ( i = 1; i <= t; ++ i )
        solve();

    f.close();
    g.close();

    return 0;
}