Cod sursa(job #1033521)

Utilizator TheNechizFMI Razvan Birisan TheNechiz Data 17 noiembrie 2013 07:20:52
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
# include <fstream>
# include <cmath>
# define ll long long
# define MODULO 9973
# define NMax 1000005
using namespace std;

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

short t;// 10^3
bool p[NMax];
int fact[NMax],ind;

/*
    p[i] = 0 , daca i este prim
    */

int NrDiv,SDiv;

void Ciur()
{
    int i,j;
    for( i = 2 ; i*i < NMax ; ++i )
        if( !p[i] )
        {
            fact[++ind] = i;
            for( j = i+i ; j < NMax ; j += i )
                p[j] = 1;
        }
}

void Tipar()
{
    fout << NrDiv << ' ' << SDiv << '\n';
}

inline int pow(int x, int p) {
    int rez = 1;
    x %= MODULO;

    for(; p; p >>= 1) {
        if(p & 1)
            rez = (rez*x)%MODULO;
        x = (x*x)%MODULO;
    }

    return rez;
}

void ssnd( ll x )
{
    NrDiv=SDiv=1;
    int d;
    for( int i = 1 ; i <= ind && 1LL*fact[i]*fact[i] <= x ; ++i )
    {
        if( x % fact[i] ) continue;
        d = 0;
        while( x % fact[i] == 0 )
        {
            x /= fact[i];
            ++d;
        }
        NrDiv *= (d+1);

        int p1 = (pow(fact[i], d+1) - 1) % MODULO;
        int p2 = pow(fact[i]-1, MODULO-2) % MODULO;

        SDiv = (((SDiv * p1) % MODULO) * p2) % MODULO;
    }
    if( x > 1 )
    {
        NrDiv *= 2;
        SDiv = (1LL*SDiv*(x+1)%MODULO);
    }
    Tipar();
}

int main()
{
    ll a;
    Ciur();
    fin >> t;
    for( int i = 1 ; i <= t ; ++i )
    {
        fin >> a;
        ssnd(a);
    }
    fin.close();
    fout.close();
    return 0;
}