Cod sursa(job #756679)

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

    for(int i = 2; i <= nmax; i++)
        if(v[i] == false)
        {
            p[++Nr] = (long long) (i);

            for(int j = i + i; j <= nmax; j +=i)
                v[j] = true;
        }

}
//
//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(long long A)
{
    long long  nk = 0, 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 %mod <<'\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;
}