Cod sursa(job #2272832)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 30 octombrie 2018 18:23:23
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>
#define PRIMEMAX 1000010

using namespace std;

bool isNotPrime[PRIMEMAX];
int primeNr[PRIMEMAX], nrOfPrimes = 0, M = 9973;

void findPrimes()
{
    for (int i=2; i<PRIMEMAX; i++)
    {
        if (isNotPrime[i] == 0)
        {
            for (int j=2; j*i<PRIMEMAX; j++)
                isNotPrime[j*i] = 1;
            primeNr[nrOfPrimes++] = i;
        }
    }

}

void findModInv(long long a, long long b, long long &x, long long &y)
{
    if (!b)
    {
        x = 1;
        y = 0;
    }
    else
    {
        findModInv(b, a%b, x, y);
        long long aux = y;
        y = x - (a / b) * y;
        x = aux;
    }

}

int main()
{
    findPrimes();
    ifstream fin("ssnd.in");
    ofstream fout("ssnd.out");
    long long t, nr, product, exp, divSum, divNr, ok, modInv, aux, auxNr;
    fin >> t;
    for (int k=0; k<t; k++)
    {
        fin >> nr;
        divNr = 1;
        divSum = 1;
        auxNr = nr;
        for (int i=0; primeNr[i]*primeNr[i]<=auxNr; i++)
        {
            product = 1;
            exp = 0;
            ok = 0;
            while (nr%primeNr[i]==0)
            {
                ok = 1;
                nr /= primeNr[i];
                exp ++;
                product *= primeNr[i];
            }
            if (ok)
            {
                divNr *= (exp+1);
                product *= primeNr[i];
                product --;
                findModInv(primeNr[i]-1, M, modInv, aux);
                if (modInv<0)
                    modInv += M;
                divSum = ( (divSum % M) * ( ( (product % M) * (modInv % M) ) % M) ) % M;
            }
        }
        fout << divNr << " " << divSum << "\n";
    }
    return 0;
}