Cod sursa(job #2099752)

Utilizator Fanika123Tanasa Stefan Fanika123 Data 4 ianuarie 2018 17:26:16
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <bits/stdc++.h>
#define nmax 1000050
#define P 9973
#define in "ssnd.in"
#define out "ssnd.out"
using namespace std;
ifstream fin(in);
ofstream fout(out);

bitset<nmax> t;
int n, prime[nmax];

void Ciur()
{
    int i, j;
    for (i = 3; i * i < nmax; i += 2)
        if (t[i] == 0)
            for (j = i * i; j < nmax; j = j + 2 * i)
                t[j] = 1;
    n = 1;
    prime[1] = 2;
    for (i = 3; i < nmax; i += 2)
        if (t[i] == 0)
            prime[++n] = i;
}

/// a^n % P
int PLog(int a, int n)
{
    int p = 1;
    while (n > 0)
    {
        if (n % 2 == 1)
        {
            p = (1LL * p * a) % P;
            n--;
        }
        n /= 2;
        a = (1LL * a * a) % P;
    }
    return p;
}

/// determina suma si numarul divizorilor lui x
void SumDiv(long long x)
{
    int i, d, nrDiv, sumaDiv, e, X1, X2;
    if (n == 1)
    {
        fout << "1 1\n";
        return;
    }
    d = 2;
    nrDiv = 1;
    sumaDiv = 1;
    for (i = 1; x > 1 && 1LL * d * d <= x; i++)
    {
        /// determin numarul de divizori si suma divizorilor lui x
        if (x % d == 0)
        {
            e = 1;
            while (x % d == 0)
            {
                e++;
                x /= d;
            }
            nrDiv *= e;
            X1 = PLog(d, e) - 1;
            if (X1 < 0) X1 += P;
            X2 = PLog(d - 1, P - 2);
            sumaDiv = (((sumaDiv * X1) % P) * X2) % P;
        }
        d = prime[i + 1];
    }
    if (x > 1)
    {
        nrDiv *= 2;
        sumaDiv = (1LL * sumaDiv * (x + 1) % P);
    }
    fout << nrDiv << " " << sumaDiv << "\n";
}

void CitireAfisare()
{
    int T;
    long long W;
    fin >> T;
    while (T > 0)
    {
        T--;
        fin >> W;
        SumDiv(W);
    }
    fin.close();
    fout.close();
}

int main()
{
    Ciur();
    CitireAfisare();
    return 0;
}