Cod sursa(job #756675)

Utilizator Theorytheo .c Theory Data 10 iunie 2012 10:40:19
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include<fstream>
#define nmax 1000000
#define mod 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
bool v[1000001];
int N, A, p[nmax/2], Nr;
int x = 0, y = 0, d = 0;
void ciur()
{
    v[0] = v[1] =true;

    for(int i = 2; i <= nmax; i++)
        if(v[i] == false)
            for(int j = i + i; j <= nmax; j +=i)
                v[j] = true;

    for(int i = 1; i <= nmax; i++ )
        if(v[i] == false)
            p[++Nr] = i;
}

void euclid(int a, int b, int &d, int &x, int &y)
{
    if(b == 0)
    {
       d = a;
       x = 1;
       y = 0;

    }
    else
    {
        int x0, y0;
        euclid(b, a%b, d, x0, y0 );
        x = y0;
        y = x0 - (a/b) * y0;
    }
}
int calc_invers(int z)
{

    euclid(z, mod, d, x, y);
    while( x < 0 )
        x += mod;
    return x % mod;
}

long long rid(int x, int y)
{

    if(!y) return 1;
    if(y % 2 == 0){
        int t = rid(x, y /2) % mod;
        return (t * t) %mod;}
    else
        return  (x *rid(x, y - 1)) %mod;
}
void desc(int A)
{
    int  nk = 1, S = 1, Nr_div = 1;



    for(int i = 1; p[i] * p[i] <= A ; i++)
    {

        if(A % p[i] == 0)
        {
            nk = 0;

            while(A % p[i] == 0)
                A /= p[i], nk++;
        Nr_div *= (nk + 1);
        long long aux1 = (rid(p[i], nk + 1) - 1 )% mod;
        long long aux2 = (rid(p[i] - 1, mod - 2)) %mod;
        S =(((S * aux1) %mod ) * aux2 )%mod;
        }

    }

   if( A > 1)
    Nr_div *= 2, S = S *(A + 1) %mod;

    fout <<Nr_div << " " << S <<'\n';


}

void read()
{
    fin >> N;
    for(int i = 1; i <= N ;i++)
        fin >> A, desc(A);
    //fout << rid (2, 10);

}

int main()
{
    ciur();
    read();
    fin.close();
    return 0;
}