Cod sursa(job #1125879)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 26 februarie 2014 19:58:32
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <bitset>

using namespace std;

const long long MOD = 9973;
const long long Nmax = 1000000;

long long P;
bitset <Nmax> ciur;
long long Primes[80000];

void gen()
{
    for ( long long i = 2; i < Nmax; i++ )
            ciur[i] = 1;

    for ( long long i = 4; i < Nmax; i += 2 )
            ciur[i] = 0;

    Primes[ ++P ] = 2;

    for ( long long i = 3; i < Nmax; i += 2 )
            if ( ciur[i] )
            {
                Primes[ ++P] = i;

                for ( long long j = 3 * i; j < Nmax; j += 2 * i )
                        ciur[j] = 0;
            }
}

long long pw( long long a, long long p )
{
    long long res = 1;

    for ( long long i = 0; ( 1LL << i ) <= p; ++i )
    {
        if ( p & ( 1LL << i ) )
                res = ( res * a ) % MOD;

        a = ( a * a ) % MOD;
    }

    return res;
}

long long inv( long long a )
{
    return pw( a, MOD - 2 );
}

void solve( long long n, ostream &f )
{
    long long nr_div = 1;
    long long sum_div = 1;

    for ( long long i = 1; i <= P && Primes[i] * Primes[i] <= n; ++i )
    {
        if ( n % Primes[i] ) continue;

        long long e = 0;

        while ( n % Primes[i] == 0 )
        {
            e++;
            n /= Primes[i];
        }

        nr_div = ( nr_div * ( e + 1 ) ) % MOD;
        sum_div = ( ( sum_div * ( pw( Primes[i], e + 1 ) - 1 + MOD ) % MOD ) * inv( Primes[i] - 1 ) % MOD ) % MOD;

    }

    if ( n > 1 )
    {
        nr_div = ( nr_div * 2 ) % MOD;
        sum_div = ( ( sum_div * ( pw( n, 2 ) - 1 + MOD ) % MOD ) * inv( n - 1 ) % MOD ) % MOD;
    }

    f << nr_div << " " << sum_div << "\n";
}

long long N;
long long T;

int main()
{
    gen();

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

    f >> T;

    while ( T-- )
    {
        f >> N;

        solve( N, g );
    }

    return 0;
}